如何在.htaccess中排除特定文件/文件夹避免被重定向?
问题描述
我的.htaccess文件配置如下:
<IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule> RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteBase / RewriteCond $1 !^(index\.php|assets/*|ajax|portal/*|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L]
我希望排除assets文件夹、portal文件夹及所有ajax请求,但通过浏览器网络面板发现这些资源仍被重定向到index.php。我对Apache2和.htaccess配置不太熟悉,查阅文档后问题仍未解决,请问该如何修复?
解决方法
问题出在排除规则的正则表达式写法错误,导致Apache无法正确识别需要排除的路径。以下是修正后的完整配置及说明:
修正后的.htaccess代码
<IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule> RewriteEngine on # 移除www前缀并跳转到HTTPS RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteBase / # 修正排除规则的正则表达式 RewriteCond $1 !^(index\.php|assets/|ajax|portal/|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L]
关键修正点
assets/*改为assets/:原写法assets/*在正则中表示匹配asset后跟随0个或多个s,无法正确匹配assets文件夹下的所有资源。改为assets/后,会匹配所有以assets/开头的路径(即该文件夹下的所有文件和子目录)。portal/*改为portal/:同理,修正后可正确匹配portal文件夹下的所有资源。- 关于ajax请求:如果你的ajax请求是路径以
ajax开头(比如/ajax/get-data),当前的ajax规则可以匹配;如果是通过请求头X-Requested-With: XMLHttpRequest识别的ajax请求,需要额外添加条件:
把这条规则加在原# 额外排除带ajax请求头的请求 RewCond %{HTTP:X-Requested-With} !XMLHttpRequestRewriteCond的下方即可。
验证建议
- 修改配置后,重启Apache服务或等待.htaccess自动生效(部分主机无需手动重启)。
- 打开浏览器开发者工具的网络面板,刷新页面,查看
assets、portal下的资源以及ajax请求的状态码,确认不再被重定向到index.php。 - 若之前有301缓存残留,可清除浏览器缓存或使用隐私模式测试。
内容的提问来源于stack exchange,提问作者wouterschiedam
相关产品推荐
相关产品推荐

