重写Nginx的try_files


8

我正在尝试将非常简单的重写从以前的nginx版本转换为当前的重写,如下所示:

location / {
   if ( !-f $request_filename ) {
     rewrite ^/([a-z]*)$ /index.php?action=$1;
     rewrite ^/([a-z]*)/(.*)$ /index.php?action=$1&item=$2;
   }
}

这就是我所走的路。显示了索引页面,但是应该像上面那样重写的任何页面都抛出404:

server {

    listen 80 default;
    root /var/www;
    index index.php;
    server_name _;

    location / {
        try_files $uri $uri/ /index.php?action=$uri&item=$args;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

我在这里做错了什么?


到底是怎么回事?问题的一部分是$ uri和$ args编码不正确。
路加福音

File not found. 如果我使用URI /page/page/id
Industrial

当你刚做的时候会发生什么try_files $uri $uri/ /index.php
路加福音

Index.php可以很好地工作,但是任何应重写的内容最终都出现在404年代
工业杂志

尝试try_files $uri $uri/ /index.php?$args。您应该可以使用来获取URL $_SERVER['REQUEST_URI']。$ _GET应该正常工作。
路加福音

Answers:


9

这应该工作:

location / { 
    try_files $uri $uri/ @rules; 
} 

location @rules { 
    rewrite ^/([a-z]*)$ /index.php?action=$1; 
    rewrite ^/([a-z]*)/(.*)$ /index.php?action=$1&item=$2; 
}

location /index.php { 
    fastcgi_pass 127.0.0.1:9000; 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
}

嗯 在您的第一个示例中,将加载index.php,但是任何静态文件或URI请求(例如)/page1/item都将返回index.php-
工业级

真奇怪 try_files应该照顾好这一点。
路加福音

也尝试了第二个示例。那里同样的问题
工业版

我假设try_files $uri $uri/可以使用静态文件?
路加福音

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.