添加斜杠到每个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)