Nginx重写规则(使用try_files?)filename.php?text = $ args(to)foldername /?text = $ args

时间:2016-01-22 18:58:51

标签: nginx url-rewriting

当我使用此请求 example.com/index.php?text=s1&sort=s2 发送参数时,如何在nginx中重写规则,但我希望nginx能够处理它是 example.com/process/?text=s1&sort=s2

" S1"和" s2"是您在搜索表单中键入的内容。

我已经尝试过这个:

rewrite ^/index.php?text=(.*)$ /process/?text=$1 last;

而且:

location ~* /index.php?text=(.*)$ {
try_files $uri /search/?text=$1;
#try_files $uri /search/?text=$is_args$args;
}

这就是..

location =index.php?text=$1&sort=$2 {
rewrite index.php?text=$1&sort=$2 /process/text=$1&sort=$2;
}

但它有点不起作用。

这是我配置的主要部分:

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~* \.php$ {
include /etc/nginx/php_params;
include /etc/nginx/fastcgi_params;
}

我很困惑..:/

2 个答案:

答案 0 :(得分:1)

?之后的任何内容都是查询字符串的一部分,并且可以使用以arg_前缀开头的变量名来访问各个值。

可以使用以下方法定义所有/index.php的简单重写:

location = /index.php {
    rewrite ^ /process/?text=$arg_q&sort=$arg_sort? last;
}

最终?阻止rewrite将旧查询字符串附加到新URI的末尾。

如果您只想挑出那些包含$arg_q参数的URI,则需要在PHP位置块中使用evil if。像这样:

location ~* \.php$ {    
    if ($arg_q) {
        rewrite ^/index.php$ /process/?text=$arg_q&sort=$arg_sort? last;
    }
    ...
}

编辑:

1)在您的情况下,URI主要由/index.php处理,但$request_uri的值(请求的原始值)用于在/index.php内路由它。如果不执行外部重定向,则很难修改$request_uri的值。

2)当/index.php作为原始请求显示时,您希望将其路由到/search/$request_uri的当前值以/index.php开头,这是无益的。

解决方案是识别$request_uri的无用值并执行外部重定向以修改$request_uri的值。像这样:

if ($request_uri ~ ^/index.php) {
    return 302 /search/?$args;
}
location / {
    try_files $uri $uri/ /index.php?$query_string;
}
location ~* \.php$ {
    ...
}

如果查询字符串相同,只需使用$args(或$query_string)来附加它。否则就像我原来的答案一样把它分成个别的论点。

答案 1 :(得分:1)

不希望编辑已接受的答案 - 我想提供一个我测试过的替代解决方案:

root ...;

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

location @index {
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    fastcgi_param REQUEST_URI $uri;
    fastcgi_pass php5-fpm-sock;
}

location ~* \.php$ {
    if ($arg_text) {
        rewrite ^/index.php$ /search/ last;
    }

    try_files $uri =404;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php5-fpm-sock;
}

此版本通过在命名位置使用$request_uri来避免不可变$uri。此外,通过使用index.php的命名位置可以避免早期的重定向循环。