Nginx中配置location的匹配规则时,访问URL时末尾加上斜杠/可以访问,末尾不加斜杠/就会报404错误。
解决思路:
既然加斜杠/可以匹配,那么可以对不加斜杠/的URL进行重写,末尾加上斜杠,然后重定向。
使用Nginx中ngx_http_rewrite_module。首先判断请求资源是否为目录类型if ( -d $request_filename ),然后利用正则匹配替换,并用rewrite中permanent来重定向"301"(rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent)
解决办法:(以下两个方法测试是有问题的)
在nginx的server里边添加:
- rewrite ^(.*[^/])$ $1/ permanent;
或者:
- if (!-f $request_filename) {
- rewrite [^/]$ $uri/ permanent;
- }
我是使用的第二个,测试可以使用,但是这个方法有个致命缺点,就是无论什么页面都会加上斜杠,造成内容页或者静态资源访问错误
正确方法:
- rewrite ^([^.]*[^/])$ $1/ permanent;
这个方法表示只要没url中不带点(.)的一律识别为文件夹,后边添加斜杠(基本可以解决问题)
参考文档:
需要在url访问后缀加/ ,而html等指定后缀不需要加:
- if ($request_uri !~* \.html$) {
- rewrite ^(.*[^/])$ $1/ permanent;
- }
但是这样.css或者.js也会被加上斜线,使用如下才最好:
- rewrite ^([^.]*[^/])$ $1/ permanent;
也就说不包含点(.)并且不以斜线/结尾的才加入。
当然还有如下:
- if (-d $request_filename) {
- rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
- }
这个判断中,如果请求的是一个文件夹,会自动在最后加上/符号,如果请求的是一个文件,则不会改变原有url
接下来对这段代码进行一个解释
1、if (-d $request_filename),如果请求的是一个文件夹,则为真,进到if语句中执行
2、rewrite是执行url重写操作
3、^/(.*)([^/])$表示以/符号开始并紧跟着任何字符,同时不是以/为结束的字符串,在我的url中,(.*)表示的ww,([^/])表示的w
4、 http://$host/$1$2/ 表示的重写后的地址,$host是请求的域名,$1是前面第一个括号里的内容ww,在我的url里就是wordpres $2是前面第二个括号里的内容
5、permanent表示,返回永久重定向的HTTP状态301
文章点评