nginx 使用尾部斜杠重写,然后应用更多规则

nginx 使用尾部斜杠重写,然后应用更多规则

在不同的网络服务器上重写总是对我来说是压垮骆驼的最后一根稻草。

目前我在服务器配置中有以下内容:

rewrite ^/(.+)$ /index.php?/$1 last;

现在,我需要确保在服务器上打开的任何 URL 都必须带有尾随/。但如果 URL 带有参数,则尾随/将被忽略。

URL 可能如下所示:

http://domain.tld/testing/           // is okay
http://domain.tld/testing            // should be redirected with trailing slash
http://domain.tld/testing#param      // should be left alone

我尝试了以下操作:

rewrite ^([^.\#]*[^/])$ /$1/ permanent;
rewrite ^/(.+)$ /index.php?/$1 last;

但是它的作用是,它会保留带有尾部斜杠的 url,但是如果 url 没有斜杠,它会在使用参数时重定向到http://domain.tld/index.php//testing/甚至 到。http://domain.tld/index.php//testing/#param

答案1

你不可以做这个。

URL 中以 开头的部分#称为片段。它永远不会发送到 Web 服务器。当浏览器看到 时http://www.example.com/page#something,它会向 发送请求http://www.example.com/page,然后将#something其用于从服务器收到的页面。

如果浏览器向 发送请求http://www.example.com/page/#something,那么它就会http://www.example.com/page/向服务器发出请求。

因此,您需要修复应用程序中的路径,以免发生您描述的问题。

相关内容