为AJAX请求设置.htaccess重写规则例外的技术咨询
解决AJAX请求被mod_rewrite规则拦截的问题
嘿,我懂你的困扰——当前的mod_rewrite规则把所有非文件/目录/符号链接的请求都导向了index.php,确实会打断AJAX的正常调用。别担心,我们只需要给AJAX请求加个“通行证”,让它们绕过重写规则就行,下面给你几种实用的方案:
方案1:用特定路径前缀区分AJAX请求
如果你的AJAX请求都是指向/ajax/开头的路径(比如/ajax/get-user-data),可以直接在现有规则前加一条排除规则:
RewriteEngine On Options -Indexes # 放行所有以/ajax/开头的请求,不进行重写 RewriteRule ^ajax/ - [L] # 原有的重写规则 RewriteCond %{REQUEST_FILENAME}!-d RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-l RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
[L]标志表示这是最后一条执行的规则,匹配到/ajax/开头的请求后,就不会再触发后面的重写逻辑,直接让服务器处理这些请求。
方案2:放行特定的AJAX处理文件
如果你的AJAX请求都是调用某个具体的处理文件(比如ajax-handler.php),可以直接排除这个文件:
RewriteEngine On Options -Indexes # 直接放行ajax-handler.php,不执行重写 RewriteRule ^ajax-handler.php$ - [L] RewriteCond %{REQUEST_FILENAME}!-d RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-l RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
方案3:通过AJAX请求头识别并放行
很多前端框架(比如jQuery)发送AJAX请求时,会自动带上X-Requested-With: XMLHttpRequest的请求头。我们可以利用这个特征来识别AJAX请求,让它们绕过重写:
RewriteEngine On Options -Indexes # 检查请求头,判断是AJAX请求就放行 RewriteCond %{HTTP_X_REQUESTED_WITH} XMLHttpRequest RewriteRule ^ - [L] RewriteCond %{REQUEST_FILENAME}!-d RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-l RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
如果是原生AJAX请求,记得手动添加这个请求头,比如:
const xhr = new XMLHttpRequest(); xhr.open('GET', '/your-ajax-endpoint', true); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.send();
方案4:放行特定后缀的请求
如果你的AJAX接口是返回特定格式的文件(比如.json、.api),可以排除这些后缀的请求:
RewriteEngine On Options -Indexes # 放行所有.json和.api后缀的请求 RewriteRule \.(json|api)$ - [L] RewriteCond %{REQUEST_FILENAME}!-d RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-l RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
小提示
优先选择方案1或方案2,因为依赖请求路径/文件的方式比依赖请求头更稳定——毕竟有些前端场景可能不会自动添加AJAX请求头,或者请求头可能被代理服务器修改。
内容的提问来源于stack exchange,提问作者Cerbion
相关产品推荐
相关产品推荐

