我的
.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 中的页面后打开开发控制台时,我可以可靠地重现这个问题(我不确定为什么 chrome 会发送该请求...加载源面板也许?它会导致“无法加载资源” “控制台中出现错误)
显然,RewriteCond 为
text/html
所做的简单子字符串搜索是不够的。我相信至少需要处理 */*
和 text/*
,但是是否有一些不那么明显的接受标头?我看到一些 application/xhtml+xml
的 RewriteCond 示例。如何编写 RewriteCond 来匹配所有 html 类型的 http 接受标头?
通常前端会使用
到Accept: application/json
获取请求来加载数据,而无需刷新整个页面(使用 php)。subdomain.example.com/folder/1234
如果 API 接受特定请求(mime 类型和/或 URL 路径),则可能会反转逻辑并首先将请求路由到 PHP API。其他请求则默认为 HTML 响应。
例如:
RewriteCond %{HTTP_HOST} ^subdomain\.example\.com$
RewriteCond %{HTTP_ACCEPT} application/json
RewriteRule ^folder/\d+$ /api.php [END]
# Otherwise default to HTML response
RewriteRule ^ /subdomains/example/index.html [END]
如果 API 只接受遵循特定模式的 URL 路径,那么这也应该包含在规则中(如上所述)。
其他注意事项...
但是,如果您转到浏览器并导航到
,它应该返回 html 页面以进行 HTML5 路由(使用静态页面)subdomain.example.com/folder/1234
如果您只是在浏览器中导航到此 URL,则浏览器应该 在
text/html
标头中包含 Accept
。
您是否检查过已记录请求的
Referer
和 User-Agent
字段,这些字段似乎从请求中省略了 text/html
mime 类型?您确定这是用户来自浏览器的直接请求吗?而不是机器人/搜索引擎流量(尽管 Googlebot 在抓取时通常包含 text/html
)?
除非在
text/html
标头中发送 Accept
,否则您无法确定发出请求的 UA 是否能够处理 HTML 响应。
如果 UA only 接受
application/xhtml+xml
(XML),那么严格来说,它不会接受 text/html
响应。 (通常,浏览器在发出任意请求时会在 Accept
标头中发送这两种 mime 类型。)
如果用户代理只接受anything(即
*/*
),那么这并不一定意味着text/html
响应是适当的。通常,对于嵌入 JS 文件的请求,我只会看到 Accept: */*
。这同样适用于仅包含 Accept: text/*
的请求。