很多时候我们使用nginx做伪静态的时候需要使用目录形式的URL。这也会出现一些问题,比如带/斜杠的可以打开 不带斜杠的就404了。
 

有时候问了能兼容所有URL,伪静态就要搞好多。 最近在开发门户网站 客户还有静态网址,伪静态规则数量已经将近200条。很多用了目录形式的URL
 

这里记录一下一个在URL尾部自动增加斜杠,URL尾部没有斜杠的自动跳转到带斜杠的URL网址。并且不影响其他文件。

往上很多教程是直接 rewrite 跳转,这样如果你有其他文件的话也一样会跳转。我做了些改进,增加了判断。可以完美兼容。

规则如下:

 

if (!-f $request_filename){
rewrite ^(.*[^/])$ $1/ permanent;
}
​

注意将上面三行代码放到你伪静态规则的 尾部,这样不影响已经存在的规则。自己的规则匹配不到的情况下最后才会跳转。

这样可以针对目录  针对html结尾的就不好用了 更好的解决办法在文末

放的位置如下图


Nginx Rewrite伪静态重写URL尾部自动增加


这样还会出现一个问题 那就是如果访问的是html 文件 也会自动加 就变成了

https://www.hulingweb.cn/jzzs/876.html/

这样也导致网址打不开 因此要加一个判断 最终使用如下代码  同样加在最后面
 

  1. #解决目录自动加斜杠  
  2. if (-d $request_filename) {  
  3.   
  4.     rewrite ^/(.*)([^/])$ http://$http_host/$1$2/ permanent;  
  5.   
  6. }  

接下来对这段代码进行一个解释:

1、if (-d $request_filename),如果请求的是一个文件夹,则为真,进到if语句中执行

2、rewrite 是执行 url 重写操作。

3、^/(.*)([^/])$ 表示以/符号开始并紧跟着任何字符,同时不是以/为结束的字符串,在我的url 中,(.*) 表示的 news。

4、http://$host/$1$2/ 表示的重写后的地址,$host 是请求的域名,$1 是前面第一个括号里的内容,在我的 url 里就是 news。

5、permanent 表示,返回永久重定向的 HTTP 状态 301。