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
相关产品推荐
相关产品推荐

