mod_rewrite的.htaccess中If规则配置引发404错误求助
问题排查与解决
核心问题分析
出现404错误的主要原因有两点:
- 正则匹配范围错误:原规则中的
([^.]+\.(jpg|png))$仅能匹配不带路径的文件名(比如test.jpg),如果请求的是带目录路径的图片(比如/asset/img/photo.png),规则不会触发,请求会被后续的目录转发规则送到index.php,导致PHP返回404;即使触发了重定向,也只会把文件名拼到CDN地址,缺失路径前缀,CDN找不到对应文件。 - 301缓存干扰测试:永久重定向会被浏览器缓存,测试阶段容易导致旧规则持续生效,掩盖真实问题。
修复步骤
1. 修正重定向规则的正则表达式
将<If>块内的RewriteRule替换为:
RewriteRule ^(.*\.(jpg|png))$ https://cdn.amante.co.kr/$1 [R=302,L,NC]
^(.*\.(jpg|png))$:匹配完整的请求路径(包含目录前缀),确保重定向后的CDN地址和源站文件路径完全一致。- 先用
R=302临时重定向,避免浏览器缓存旧规则,测试验证正常后再改回R=301。
2. 验证CDN文件路径
确认CDN上的文件存储路径和源站完全对应,比如源站图片地址是http://your-domain.com/uploads/pic.jpg,CDN上必须存在https://cdn.amante.co.kr/uploads/pic.jpg,否则依然会返回404。
3. 清除浏览器缓存
测试前清除浏览器缓存,或者使用隐私模式访问,避免旧的301缓存影响测试结果。
4. 规则优先级确认(可选)
如果图片存放在asset、system等目录下,当前配置中<If>块已经位于所有转发规则之前,只要正则正确就能优先触发重定向;如果后续新增了其他规则,需确保重定向规则始终在转发到index.php的规则之前。
修正后的完整.htaccess示例
RewriteEngine On RewriteBase / Options +FollowSymLinks -Indexes <If "%{REMOTE_ADDR} == '127.0.0.1'"> RewriteRule ^(.*\.(jpg|png))$ https://cdn.amante.co.kr/$1 [R=302,L,NC] </If> RewriteCond %{REQUEST_URI} ^system.* RewriteRule ^(.*)$ /index.php?/$1 [L] RewriteCond %{REQUEST_URI} ^application.* RewriteRule ^(.*)$ /index.php?/$1 [L] RewriteCond %{REQUEST_URI} ^asset.* RewriteRule ^(.*)$ /index.php?/$1 [L] RewriteCond %{REMOTE_ADDR} !^12\.345\.678\.901$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L]
内容的提问来源于stack exchange,提问作者Lợi Nguyễn Phước
相关产品推荐
相关产品推荐

