QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

PHP基础

【踩坑日志】nginx伪静态最后无斜杠的时候报404错误

 shitouadmin  2023-06-23 12:16:06

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里边添加:

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

或者:

  1. if (!-f $request_filename) { 
  2.      rewrite [^/]$ $uri/ permanent; 
  3.    } 


我是使用的第二个,测试可以使用,但是这个方法有个致命缺点,就是无论什么页面都会加上斜杠,造成内容页或者静态资源访问错误


正确方法:

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

这个方法表示只要没url中不带点(.)的一律识别为文件夹,后边添加斜杠(基本可以解决问题)


参考文档:

需要在url访问后缀加/ ,而html等指定后缀不需要加:

  1. if ($request_uri  !~*  \.html$) { 
  2.     rewrite ^(.*[^/])$ $1/ permanent; 

但是这样.css或者.js也会被加上斜线,使用如下才最好:

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

也就说不包含点(.)并且不以斜线/结尾的才加入。

当然还有如下:

  1. if (-d $request_filename) { 
  2.     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


 

¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《【踩坑日志】nginx伪静态最后无斜杠的时候报404错误》发布于石头博客文章,作者:shitouadmin,如若转载,请注明出处:https://www.pweb123.com/html/php/957.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有0条评论
点击图片更换

添加微信好友

添加微信好友

微信小程序

百度小程序