5

There is more than one redirect with trailing slash in secure non-www url. This doesn’t happen on homepage url like https://example.com. As you can see from below a secure non-www url is forwarded to a url with trailing slash and then again forwarded to one with no slash. I am running magento 2.3.3, Nginx, PHP 7.3 on centos 7. Below is my nginx conf file. Below is the server nginx conf file. Any clue would be highly appreciated.

https://example.com/mens-wear
https://www.example.com/mens-wear/
https://www.example.com/mens-wear

server {
    listen      443 ssl http2;
    server_name example.com www.example.com;
    ssl_protocols       TLSv1.2  TLSv1.3;
    root        /home/example/web/example.com/public_html/pub;
    index       index.php;
    autoindex   off;
    charset     UTF-8;
    error_page  404 403 = /errors/404.php;
    add_header  "X-UA-Compatible" "IE=Edge";

    ssl_certificate      /home/example/conf/web/ssl.example.com.pem;
    ssl_certificate_key  /home/example/conf/web/ssl.example.com.key;

    access_log  /var/log/nginx/domains/example.com.log combined;
    access_log  /var/log/nginx/domains/example.com.bytes bytes;
    error_log   /var/log/nginx/domains/example.com.error.log error;

    # PHP entry point for setup application
    location ~* ^/setup($|/) {
        root /home/example/web/example.com/public_html;

        location ~ ^/setup/index.php {
            fastcgi_pass   127.0.0.1:9002;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        /etc/nginx/fastcgi_params;
        }

        location ~ ^/setup/(?!pub/). {
            deny all;
        }

        location ~ ^/setup/pub/ {
            add_header X-Frame-Options "SAMEORIGIN";
        }
    }

    # PHP entry point for update application
    location ~* ^/update($|/) {
        root /home/example/web/example.com/public_html;

        location ~ ^/update/index.php {
            fastcgi_split_path_info ^(/update/index.php)(/.+)$;
            fastcgi_pass   127.0.0.1:9002;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO        $fastcgi_path_info;
            include        /etc/nginx/fastcgi_params;
        }

        # Deny everything but index.php
        location ~ ^/update/(?!pub/). {
            deny all;
        }

        location ~ ^/update/pub/ {
            add_header X-Frame-Options "SAMEORIGIN";
        }
    }

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

    location /pub/ {
        location ~ ^/pub/media/(downloadable|customer|import|theme_customization/.*\.xml) {
            deny all;
        }

        alias /home/example/web/example.com/public_html/pub/;
        add_header X-Frame-Options "SAMEORIGIN";
    }

    location /static/ {
        # Uncomment the following line in production mode
        # expires max;

    # Remove signature of the static files that is used to overcome the browser cache
        location ~ ^/static/version {
            rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
        }

        location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2|json)$ {
            add_header Cache-Control "public";
            add_header X-Frame-Options "SAMEORIGIN";
include /etc/nginx/magento2-cors.conf;           
        expires +1y;

    if (!-f $request_filename) {
                rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
            }
        }

        location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
            add_header Cache-Control "no-store";
            add_header X-Frame-Options "SAMEORIGIN";
include /etc/nginx/magento2-cors.conf;           
        expires    off;

    if (!-f $request_filename) {
                rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
            }
        }

        if (!-f $request_filename) {
            rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
        }

        add_header X-Frame-Options "SAMEORIGIN";
include /etc/nginx/magento2-cors.conf;
    }

    location /media/ {
        try_files $uri $uri/ /get.php?$args;

        location ~ ^/media/theme_customization/.*\.xml {
            deny all;
        }

        location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
            add_header Cache-Control "public";
            add_header X-Frame-Options "SAMEORIGIN";
include /etc/nginx/magento2-cors.conf;
            expires +1y;
            try_files $uri $uri/ /get.php?$args;
        }

        location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
            add_header Cache-Control "no-store";
            add_header X-Frame-Options "SAMEORIGIN";
include /etc/nginx/magento2-cors.conf;
            expires    off;
            try_files $uri $uri/ /get.php?$args;
        }

        add_header X-Frame-Options "SAMEORIGIN";
include /etc/nginx/magento2-cors.conf;    
    }

    location /media/customer/ {
        deny all;
    }

    location /media/downloadable/ {
        deny all;
    }

    location /media/import/ {
        deny all;
    }

    location /errors/ {
        location ~* \.xml$ {
            deny all;
        }
    }

    # PHP entry point for main application
    location ~ (index|get|static|report|404|503|info)\.php$ {
        try_files $uri =404;

        fastcgi_pass   127.0.0.1:9002;
        fastcgi_buffers 1024 4k;
        fastcgi_read_timeout 600s;
        fastcgi_connect_timeout 600s;

        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        /etc/nginx/fastcgi_params;
    }

    gzip on;
    gzip_disable "msie6";

    gzip_comp_level 6;
    gzip_min_length 1100;
    gzip_buffers 16 8k;
    gzip_proxied any;
    gzip_types
        text/plain
        text/css
        text/js
        text/xml
        text/javascript
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/xml+rss
        image/svg+xml;
    gzip_vary on;

    # Banned locations (only reached if the earlier PHP entry point regexes don't match)
    location ~* (\.php$|\.htaccess$|\.git) {
        deny all;
    }

    location /vstats/ {
        alias   /home/example/web/example.com/stats/;
        include /home/example/conf/web/example.com.auth*;
    }

    include     /etc/nginx/conf.d/phpmyadmin.inc*;
    include     /etc/nginx/conf.d/phppgadmin.inc*;
    include     /etc/nginx/conf.d/webmail.inc*;

    include     /home/example/conf/web/snginx.example.com.conf*;
}
4

How are you currently handling the redirect? I assume since you only have the 1 Nginx server block for the site and letting Magento handle it the redirect using the Base Url?

Adding a server block like so and removing the example.com server name from the existing block should handle redirecting with the exact same request URI (not appending /).

server {
    listen 80;
    listen 443 ssl;
    server_name example.com;
    return 301 $scheme://www.example.com$request_uri;
}

Opting for using Nginx to handle the redirect would increase performance + server load too.

| improve this answer | |
  • This is my non-ssl nginx conf. server { listen 80; server_name example.com www.example.com; return 301 example.com$request_uri; } – Zoya Dec 11 '19 at 2:47
  • Does https request go through the above conf? – Zoya Dec 11 '19 at 2:49
  • If you want the one directive to listen to both https/http you can use 2 listen directives (updated answer) – Sam Dec 11 '19 at 7:38
  • I tried this. Still the secure non-www url goes through more than one redirect. – Zoya Dec 11 '19 at 8:47

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.