我有一个非常有趣的行为。我想避免在我的网站上的网址末尾加斜杠。我已将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 ... }
答案 0 :(得分:1)
https://example.com
实际上并不存在,根URI是/
-它在浏览器地址栏中的显示方式取决于浏览器-有些会自动显示单独的/
,而另一些会自动显示删除单独的/
。
因此您不能从https://example.com/
重定向到https://example.com
-它会被默默地解释为从https://example.com/
到https://example.com/
的重定向。
在评估location
和rewrite
语句并生成$uri
变量时,Nginx使用normalized URI。多个连续出现的/
被折叠成一个/
。
尽管正则表达式^/(.*)/$
与URI //
匹配,但是该语句永远看不到它。因为Nginx已经将该URI规范化为/
,所以与正则表达式不匹配。
如果有多个/
的根URI出现问题,请将正则表达式应用于$request_uri
变量,该变量包含规范化之前的原始URI,还包括查询字符串(如果有)。
例如:
if ($request_uri ~ "^/{2,}(\?|$)") {
return 301 /$is_args$args;
}
这可以放置在您的location / {...}
块中。关于if
的使用,请参见this caution。