使用PHP与.htaccess搭建维护页配置IP限制后静态资源加载失败如何解决
问题原因
- 静态资源放行规则正则语法错误:你写的
RewriteCond %{REQUEST_URI} !^/pub/*.*$逻辑存在缺陷,*是正则量词不能单独匹配路径字符,该规则无法覆盖所有/pub/目录下的资源路径,导致静态资源请求被重定向到维护页,加载失败。 - 维护页匹配规则错误:
RewriteCond %{REQUEST_URI} !^/maintenance\$多了不必要的\$转义,实际会要求URI末尾包含$字符才能放行,无法正常匹配维护页面路径。 - IP匹配规则不严谨:
!^123.456.789没有对IP中的点做转义,正则中.默认是通配符,容易出现误匹配。 - 规则顺序不合理:维护模式的全局重定向规则应该放在去PHP后缀规则之前,避免非白名单用户的请求被提前处理。
- 重复冗余配置:不需要两次声明
RewriteEngine On,全局声明一次即可。
修复后的配置
# 全局重写配置 RewriteEngine On RewriteBase / # 维护模式规则(放在最前面优先执行) # 替换123.456.789.为你的实际IP段,IP中的点需要转义 RewriteCond %{REMOTE_ADDR} !^123\.456\.789\. # 放行/pub/下所有静态资源,NC参数忽略大小写适配大写PUB目录 RewriteCond %{REQUEST_URI} !^/pub/ [NC] # 放行维护页本身,避免循环重定向 RewriteCond %{REQUEST_URI} !^/maintenance$ RewriteRule ^(.*)$ http://example.com/maintenance [R=307,L] # 去除.php后缀规则 Options +MultiViews RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
额外注意事项
- 如果你的服务器是Linux系统,文件路径大小写敏感,建议把静态资源目录名统一为小写
pub,或者确保页面中静态资源的引用路径和实际目录名大小写完全一致。 - 测试前清空浏览器缓存,307重定向会被浏览器临时缓存,避免旧配置影响测试结果。
内容的提问来源于stack exchange,提问作者LaravelBeginer
相关产品推荐
相关产品推荐

