我正在尝试重定向这个丑陋的网址,
/index.php/component/qs/?com=qs&id=1234
到,
/product/?id=1234
所以我想做这样的事,
server {
listen 443 ssl http2 default_server;
listen 443 [::]:443 ssl http2 default_server;
server_name www.example.com;
root /home/example/public_html/;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
if($query_string ~ "id=(\d+)") {
rewrite ^.*$ /products/?id=$1 permanent;
}}
location ~ \.php$ {
include snippets/fastcgi-php.conf
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_intercept_errors on;
}
}
当我运行时nginx -t
出现以下错误,
nginx: [emerg] unknown directive "if($query_string"
我曾在 Apache 下工作过,但是对 Nginx 还不熟悉,如能提供任何帮助我将非常感激。
答案1
nginx 将 URL 查询参数存储在$arg_name
参数中。
因此,您可以$arg_id
在语句中使用if
。此外,您应该在location /
指令前使用另一个位置:
location /index.php/component/qs {
if ($arg_id) {
rewrite ^ /products/?id=$arg_id permanent;
}
}
如果$arg_id
是空字符串,if
则不执行该语句。在 中rewrite
,^
是告诉它重写任何 URL 的最短形式。由于 URL 和id
参数已提前匹配,因此无需在rewrite
语句中进行任何匹配。
答案2
指令名称后面缺少一个空格if
。应该是:
if ($query_string ~ "id=(\d+)")
不是
if($query_string ~ "id=(\d+)")