如何在.htaccess中正确配置URL重写规则以排除PDF和JPG文件
如何在.htaccess中正确排除PDF和JPG文件不被URL重写?
问题描述
我有一个用于特定场景下URL重写的.htaccess文件,内容如下:
RewriteEngine On RewriteRule \.php$ - [L,NC] RewriteRule ^(?:favicon\.ico|(?:index|custom500|custom404)\.html)$ - [L,NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .+ index.php?source=$0 [L,QSA]
其中已有规则可避免index.html、custom404.html、custom500.html和favicon.ico被纳入重写范围,同时也排除了所有.php文件。现在我希望将所有以PDF或JPG为扩展名的文件也加入排除列表,尝试添加规则:
RewriteRule ^(?:favicon\.ico|(?:index|custom500|custom404)\.html|?:\*\.pdf)$ - [L,NC]
但Apache仍会将此类文件以index.php?source=myfile.pdf的形式返回。请问如何正确将PDF和JPG文件添加到重写排除列表中?
解决方案
你的问题出在新增的正则表达式语法错误上,?:\*\.pdf这部分不符合Apache mod_rewrite的正则规则(*是量词不能单独这样使用,而且分组语法也有误)。下面是修正后的完整规则:
RewriteEngine On # 排除所有.php文件 RewriteRule \.php$ - [L,NC] # 排除指定的静态文件(包括PDF、JPG) RewriteRule ^(?:favicon\.ico|(?:index|custom500|custom404)\.html|.*\.(?:pdf|jpg))$ - [L,NC] # 仅当请求的文件不存在时,重写到index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .+ index.php?source=$0 [L,QSA]
关键修正说明
- 正则语法修正:将错误的
?:\*\.pdf替换为.*\.(?:pdf|jpg):.*匹配任意长度的字符(对应文件名部分)\.(?:pdf|jpg)匹配.pdf或.jpg扩展名,(?:...)是非捕获分组,避免不必要的内存占用
- 规则顺序保持:确保排除规则放在重写规则之前,因为mod_rewrite是按顺序处理规则的,匹配到排除规则后会用
[L]标记终止后续处理 - 大小写兼容性:保留
[NC]标记,这样.PDF、.JPG这类大写扩展名的文件也会被正确排除
如果你的场景中还需要排除其他格式(比如PNG),只需要在括号里添加即可,例如(?:pdf|jpg|png)。
内容的提问来源于stack exchange,提问作者user2399035
相关产品推荐
相关产品推荐

