You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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} !XMLHttpRequest
    
    把这条规则加在原RewriteCond的下方即可。

验证建议

  • 修改配置后,重启Apache服务或等待.htaccess自动生效(部分主机无需手动重启)。
  • 打开浏览器开发者工具的网络面板,刷新页面,查看assets、portal下的资源以及ajax请求的状态码,确认不再被重定向到index.php。
  • 若之前有301缓存残留,可清除浏览器缓存或使用隐私模式测试。

内容的提问来源于stack exchange,提问作者wouterschiedam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:57:31