1

我有一组在我的应用程序中更改的 url 路径,例如:

  • /dataview/unknownvvvo/ => /backend/unknown-vvvo
  • /dataview/servicecounter => /backend/servicecounter-events

我尝试使用 nginx 中的重写规则来解决这个问题:

user app app;

error_log /dev/stderr debug;

events {}

http {
    include       mime.types;
    default_type  application/octet-stream;
    rewrite_log on;
    
    charset  utf-8;

    server {
        listen  80;
        listen  [::]:80;

        root  /app/app/public;
        index index.php index.html;

        rewrite ^/dataview/unknownvvvo(.*)$ /backend/unknown-vvvo$1 last;
        rewrite ^/dataview/servicecounter(.*)$ /backend/servicecounter-events$1 last;

        location / {
            try_files $uri /index.php$is_args$args;
        }

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

但是,例如,当我在浏览器中调用“http://localhost/dataview/unknownvvvo”时,nginx 错误日志告诉我重写成功,但它给了我一个 404 错误: nginx_err

根据 nginx 文档,这应该可以工作,那么我在这里错过了什么?

4

2 回答 2

0

将“最后”标志更改为“永久”有效。但是将 fastcgi 参数 REQUEST_URI 更改为$uri$is_args$args不是:

user app app;

error_log /dev/stderr debug;

events {}

http {
    include       mime.types;
    default_type  application/octet-stream;
    rewrite_log on;

    charset  utf-8;

    server {
        listen  80;
        listen  [::]:80;

        root /app/app/public;
        index index.php index.html;
    
        rewrite ^/dataview/unknownvvvo(.*)$ /backend/unknown-vvvo$1 last;
        rewrite ^/dataview/servicecounter(.*)$ /backend/servicecounter-events$1 last;


        location / {
            try_files $uri /index.php$is_args$args;
        }

        location /index.php {
            fastcgi_pass  php-fpm_cms:9000;
            include       fastcgi_params;

            fastcgi_param REQUEST_URI $uri$is_args$args;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}

从控制台输出看来,原始请求 uri 仍被传递给 cgi 服务器,而不是重写的: 在此处输入图像描述

于 2022-03-04T07:06:27.990 回答
0

您正在从 to 重写(使用 rewrite),然后从to/dataview/unknownvvvo重写/backend/unknown-vvvo(使用 try_files)。您的脚本将使用(可能是 REQUEST_URI)中定义的值来确定请求的路径——当然,它没有被更改。/backend/unknown-vvvo/index.phpindex.phpfastcgi_params

最简单的解决方案是使用外部重定向,在语句末尾使用permanent而不是。lastrewrite

rewrite ^/dataview/unknownvvvo(.*)$ /backend/unknown-vvvo$1 permanent;
rewrite ^/dataview/servicecounter(.*)$ /backend/servicecounter-events$1 permanent;
于 2022-03-03T18:40:26.847 回答