奇怪的Nginx行为加上斜杠

时间:2018-11-06 08:42:00

标签: nginx url-rewriting nginx-config

我有一个非常有趣的行为。我想避免在我的网站上的网址末尾加斜杠。我已将rewrite ^/(.*)/$ /$1 permanent;规则放入我的服务器块中,因此
https://example.com/something/
https://example.com/something////
重定向到
https://example.com/something;

https://example.com/
重定向到
https://example.com

但是https://example.com////被重定向到... https://enjoygifts.ru////(实际上不重定向,它是200个代码)。为什么?

这是我的服务器块:


    server {
        listen 443 ssl;
        ...
        ... ssl directives
        ...

        root        /var/www/mysite.com;
        index       index.php;
        server_name mysite.com;
        rewrite ^/(.*)/$ /$1 permanent;

        location / {
            rewrite ^/.*$ /index.php last;
        }

        location ~ ^/index.php {
            try_files    $uri =404;
            include      /etc/nginx/fastcgi.conf;
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ ^/storage/app/uploads/public { try_files $uri 404; }
        ...
        ... lot of similar location blocks
        ...
    }

1 个答案:

答案 0 :(得分:1)

https://example.com实际上并不存在,根URI是/-它在浏览器地址栏中的显示方式取决于浏览器-有些会自动显示单独的/,而另一些会自动显示删除单独的/

因此您不能从https://example.com/重定向到https://example.com-它会被默默地解释为从https://example.com/https://example.com/的重定向。

在评估locationrewrite语句并生成$uri变量时,Nginx使用normalized URI。多个连续出现的/被折叠成一个/

尽管正则表达式^/(.*)/$与URI //匹配,但是该语句永远看不到它。因为Nginx已经将该URI规范化为/,所以与正则表达式不匹配。


如果有多个/的根URI出现问题,请将正则表达式应用于$request_uri变量,该变量包含规范化之前的原始URI,还包括查询字符串(如果有)。

例如:

if ($request_uri ~ "^/{2,}(\?|$)") { 
    return 301 /$is_args$args; 
}

这可以放置在您的location / {...}块中。关于if的使用,请参见this caution