简体   繁体   中英

How to redirect subpaths in nginx with nginx rewrite module?

I have a set of url paths which having changed in my application, eg:

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

I try to address this with rewrite rules in 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;
        }
    }
}

But when I call 'http://localhost/dataview/unknownvvvo' in the browser for example, the nginx error log tells me the rewrite was successful, but it gives me a 404 error: nginx_err

According to the nginx docs this should work, so what did I miss here?

You are rewriting (with rewrite) from /dataview/unknownvvvo to /backend/unknown-vvvo , then rewriting (with try_files) from /backend/unknown-vvvo to /index.php . Your index.php script will use the values defined in fastcgi_params (probably REQUEST_URI) to determine the requested path - which of course, has not been changed.

The simplest solution is to use an external redirect, using permanent instead of last on the end of the rewrite statements.

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

Changing "last" flags to "permanent" works. But changing fastcgi param REQUEST_URI to $uri$is_args$args not:

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;
        }
    }
}

From console output it looks like that still the original request uri is passed to cgi server instead the rewritten one: 在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM