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

Gom*_*mez 48 regex rewrite nginx

我尝试在每个网址结尾处获得一个"/":

example.com/art

应该

example.com/art/

我使用nginx作为webserver.

我需要重写规则..

为了更好地理解,请检查:

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

如果你按下大图下的一个小缩略图,它会重新加载并显示这个网址:

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

如果我现在在所有网址上都有一个斜杠(最后),那么无需重新加载网站即可.

现在我在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;
  }
}
Run Code Online (Sandbox Code Playgroud)

如何配置nginx以添加斜杠?(我想我应该重写规则?)

小智 104

更有可能我认为你会想要这样的东西:

rewrite ^([^.]*[^/])$ $1/ permanent;
Run Code Online (Sandbox Code Playgroud)

正则表达式转换为:"重写所有URI而不使用任何'.' 在它们中没有以'/'结尾的URI +'/'"或简单地说:"如果URI没有句点并且没有以斜杠结尾,则在末尾添加斜杠"

仅重写URI而没有点的原因使得任何具有文件扩展名的文件都不会被重写.例如你的图像,CSS,JavaScript等,并防止可能的重定向循环,如果使用一些自己的重写的PHP框架也

另外一个常见的重写是:

rewrite ^([^.]*)$ /index.php;
Run Code Online (Sandbox Code Playgroud)

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

  • 这是互联网上唯一不对所有内容添加斜线的帖子。感谢您的发布。 (2认同)

Mar*_*arc 24

rewrite ^([^.\?]*[^/])$ $1/ permanent;
Run Code Online (Sandbox Code Playgroud)

避免使用/标记的休息URL的查询字符串.

例如

/ myrest /办?d = 12345

  • 你怎么能得到结果 ``` /myrest/do/?d=12345 ``` (2认同)

bry*_*yan 8

对于nginx:

rewrite ^(.*[^/])$ $1/ permanent;
Run Code Online (Sandbox Code Playgroud)

  • 这将为一切添加一个斜杠 - 所以你最终会得到index.php - > index.php /,并且页面?a = b - > page?a = b /其中OP肯定需要的是页面?a = b - > page /?a = b (2认同)

And*_*ore 5

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

server {
   # ...
   if (!-f $request_filename) {
     rewrite [^/]$ $uri/ permanent;
   }
   location / {
      # CMS logic, e.g. try_files $uri $uri /index.php$request_uri;
   }
   # ...
}
Run Code Online (Sandbox Code Playgroud)

第二个,许多人更喜欢,因为如果不是 100% 必要,他们宁愿避免使用任何使用,是使用 try_files 在它不会命中文件时将请求发送到命名的位置块。例如

server {
   # ...
   location / {
      try_files $uri $uri/ @cms;
   }
   location @cms {
      rewrite [^/]$ $uri/ permanent;
      # CMS logic, e.g. rewrite ^ /index.php$request_uri;
   }
   # ...
}
Run Code Online (Sandbox Code Playgroud)


Mor*_*075 -4

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

这会将不带“/”的所有内容 ($1) 重定向(状态代码 301)到“$1/”

  • 这个答案似乎提供了 Apache 的语法,但最初的问题是针对 nginx 的。 (12认同)