添加斜杠到每个url的末尾(需要对nginx重写规则)

我试图得到一个“/”到每个url的结尾:

example.com/art

应该

example.com/art/

我使用nginx作为web服务器。

我需要这个重写规则..

为了更好的理解检查这个:

http://3much.schnickschnack.info/art/projekte

如果你按下一个小图片下的大缩略图重新加载并显示此url:

http://3much.schnickschnack.info/art/projekte/#0

如果我现在在所有url上都有一个斜杠(最后),它将无需重新加载站点。

现在我在nginx-http.conf中有这个设置:

server { listen *:80; server_name 3much.schnickschnack.info; access_log /data/plone/deamon/var/log/main-plone-access.log; rewrite ^/(.*)$ /VirtualHostBase/http/3much.schnickschnack.info:80/2much/VirtualHostRoot/$1 last; location / { proxy_pass http://cache; } } 

如何configurationnginx添加斜杠? (我想我应该重写规则?)

更可能的是我想你会想要这样的东西:

 rewrite ^([^.]*[^/])$ $1/ permanent; 

正则expression式转换为:“无需重写所有URI”。 在那些不以'/'结尾的URI +'/'中,或者简单地说:“如果URI没有句点,并且不以斜线结尾,则在末尾添加一个斜杠”

只重写URI中没有点的原因,使得任何带有文件扩展名的文件都不会被重写。 例如,您的图像,CSS,JavaScript等,并防止可能的redirect循环,如果使用一些PHP框架,也做自己的重写

伴随这个的另一个常见重写是:

 rewrite ^([^.]*)$ /index.php; 

这非常简单地将所有没有句点的URI重写到你的index.php文件(或者你可以执行你的控制器的任何文件)。

 rewrite ^([^.\?]*[^/])$ $1/ permanent; 

以避免resturlquerystrings得到一个/标记。

例如

/ myrest /办?d = 12345

对于nginx:

 rewrite ^(.*[^/])$ $1/ permanent; 

使用Wordpress中的Anthonysomerset重写,我试验了由于redirect循环而访问/ wp-admin仪表板的问题。 但是我使用上面的条件解决了这个问题:

 if ($request_uri !~ "^/wp-admin") { rewrite ^([^.]*[^/])$ $1/ permanent; rewrite ^([^.]*)$ /index.php; } 
 server { # ... omissis ... # put this before your locations rewrite ^(/.*[^/])$ $1/ permanent; # ... omissis ... } 

如果你想要某种请求(比如GET请求),可以阻止这样做(通常是关于POST请求,因为rewrite将任何请求方法变成GET ,这可能会破坏你网站的一些dynamicfunction),添加一个if条款:

 server { # ... omissis ... # put this before your locations if ($request_method = "GET" ) { rewrite ^(/.*[^/])$ $1/ permanent; } # ... omissis ... } 

你也可以把rewrite放在一个location块( if太),使其更具体。

这太晚了,但我想分享我的解决scheme,我遇到了跟​​踪斜线和Nginx的问题。

 #case : # 1. abc.com/xyz => abc.com/xyz/ # 2. abc.com/xyz/ => abc.com/xyz/ # 3. abc.com/xyz?123&how=towork => abc.com/xyz/?123&how=towork # 4. abc.com/xyz/?123&ho=towork => abc.com/xyz/?123&how=towork 

这是我的解决scheme

 server { .... # check if request isn't static file if ($request_filename !~* .(gif|html|jpe?g|png|json|ico|js|css|flv|swf|pdf|xml)$ ) { rewrite (^[^?]+[^/?])([^/]*)$ $1/$2 permanent; } .... location / { .... } } 

奇怪的是,这是谷歌的第一个结果,但没有一个令人满意的答案。 有两个好方法可以做到这一点我知道。 首先是直接检查请求是否会打到一个文件,如果不是,则只应用一个重写条件。 例如

 server { # ... if (!-f $request_filename) { rewrite [^/]$ $uri/ permanent; } location / { # CMS logic, eg try_files $uri $uri /index.php$request_uri; } # ... } 

第二种, 如果不是100%必要的, 那么他们宁愿避免任何使用,就是使用try_files将请求发送到指定的位置块,而不会碰到文件。 例如

 server { # ... location / { try_files $uri $uri/ @cms; } location @cms { rewrite [^/]$ $uri/ permanent; # CMS logic, eg rewrite ^ /index.php$request_uri; } # ... } 

试试这个: ^(.*)$ http://domain.com/$1/ [L,R=301]

这将redirect(状态码301)没有“/”到“$ 1 /”的所有内容($ 1)