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

Apache mod_rewrite:如何编写RewriteCond匹配所有HTML类型的HTTP Accept头?

问题:匹配所有HTML类型的HTTP Accept头的RewriteCond写法

我在.htaccess中配置了以下规则,用于检测用户访问特定主机且请求HTML时,返回指定的HTML文件:

RewriteCond %{HTTP_HOST} ^example\.domain\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^example\.domain\.eu$ [NC]
RewriteCond %{HTTP_ACCEPT} text/html [NC]
RewriteRule ^ /subdomains/example/index.html [END]

# Otherwise go to php api

该规则看似正常工作,但收到大量PHP API的未匹配路由警告日志,这些路由本应指向上述index.html。调试发现存在携带Accept: */*的请求(在Chrome开发者控制台可复现)。仅通过子字符串匹配text/html的RewriteCond并不足够,需要处理*/*、text/*以及application/xhtml+xml等Accept头,请问如何编写对应的RewriteCond?


解决方案

可以通过正则表达式覆盖所有期望的HTML类型Accept头,替换原有的RewriteCond %{HTTP_ACCEPT} text/html [NC]规则为以下内容:

RewriteCond %{HTTP_ACCEPT} ^(.*,)?(text/html|application/xhtml\+xml|text/\*|\*/\*)(,.*)?$ [NC]

规则说明:

  • ^(.*,)?:匹配Accept头开头可能存在的任意内容(包括逗号分隔的其他类型前缀)
  • (text/html|application/xhtml\+xml|text/\*|\*/\*):精确匹配目标HTML相关类型:
    • text/html:标准HTML类型
    • application/xhtml+xml:XHTML类型
    • text/*:所有文本类型(包含HTML)
    • */*:任意类型(浏览器默认或通配符请求)
  • (,.*)?$:匹配Accept头结尾可能存在的任意内容(包括逗号分隔的其他类型后缀)
  • [NC]:忽略大小写,兼容不同大小写的头信息

修改后的完整规则:

RewriteCond %{HTTP_HOST} ^example\.domain\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^example\.domain\.eu$ [NC]
RewriteCond %{HTTP_ACCEPT} ^(.*,)?(text/html|application/xhtml\+xml|text/\*|\*/\*)(,.*)?$ [NC]
RewriteRule ^ /subdomains/example/index.html [END]

# Otherwise go to php api

这个规则会覆盖所有常见的期望返回HTML的请求场景,避免符合条件的请求落入PHP API路由。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:04:51