Search code examples
nginxfastcginginx-locationphp-7.2

How to fix redirect to trailing slash with nginx and php backend


Like in this thread i run into the same problem with trailing slashes.

Directory /var/www/services contains several backend services. For example, i'm requesting GET /customer?arg1=1&arg2=2 nginx will always redirects me to /customer/?arg1=1&arg2=2.

Nginx log output:

172.18.0.6 - - [29/May/2019:14:47:32 +0000] "GET /customer?limit=1&filter%5Bemail%5D=somemail%40gmail.com&filter%5BwebsiteId%5D=1 HTTP/1.1" 301 170 "-" "GuzzleHttp/6.3.3 curl/7.29.0 PHP/7.0.33"
172.18.0.6 - - [29/May/2019:14:47:32 +0000] "GET /customer/?limit=1&filter%5Bemail%5D=somemail%40gmail.com&filter%5BwebsiteId%5D=1 HTTP/1.1" 200 12 "-" "GuzzleHttp/6.3.3 curl/7.29.0 PHP/7.0.33"

All other requests, like customer/count works as expected.

How can i avoid such undesired behaviour?

Configuration is below:

server {
        listen 80;
        listen 443 ssl;
        server_name api.local;
        root /var/www/services;

        ssl_certificate  /etc/ssl/certs/optimax.crt;
        ssl_certificate_key /etc/ssl/certs/optimax.key;
        ssl_dhparam /etc/ssl/certs/optimax.pem;

        location ~ ^/(?<ms_dir>[^/]+)/(.*)$ {
                root /var/www/services/$ms_dir/public;
                set $ms_request $2;
                try_files $uri /index.php$is_args$args;
        }

        location ~ /index\.php(/|$) {
                fastcgi_pass php72:9001;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include fastcgi_params;
                fastcgi_param REQUEST_URI $ms_request;
                fastcgi_param SCRIPT_FILENAME $realpath_root/$ms_dir/public$fastcgi_script_name;
                fastcgi_param DOCUMENT_ROOT $realpath_root/$ms_dir/public;
        }

        access_log /dev/stdout;
        error_log /dev/stderr;
        rewrite_log on;
}

Solution

  • The Richard Smith's suggestion works perfect.

    Updated config below:

    server {
            listen 80;
            listen 443 ssl;
            server_name api.local;
            root /var/www/services;
    
            ssl_certificate  /etc/ssl/certs/optimax.crt;
            ssl_certificate_key /etc/ssl/certs/optimax.key;
            ssl_dhparam /etc/ssl/certs/optimax.pem;
    
            location ~ /index\.php(/|$) {
                    fastcgi_pass php72:9001;
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
                    include fastcgi_params;
                    fastcgi_param REQUEST_URI $ms_request;
                    fastcgi_param SCRIPT_FILENAME $realpath_root/$ms_dir/public$fastcgi_script_name;
                    fastcgi_param DOCUMENT_ROOT $realpath_root/$ms_dir/public;
            }
    
            location ~ ^/(?<ms_dir>[^/]+)(?:/(.*))$ {
                    root /var/www/services/$ms_dir/public;
                    set $ms_request $2;
                    try_files $uri /index.php$is_args$args;
            }
    
            access_log /dev/stdout;
            error_log /dev/stderr;
            rewrite_log on;
    }