当我使用此请求 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;
}
我很困惑..:/
答案 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
的命名位置可以避免早期的重定向循环。