nginx 301 重定向查询字符串

nginx 301 重定向查询字符串

我正在尝试重定向这个丑陋的网址,

/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+)")

相关内容