在apache的mod_rewrite中,如何编写RewriteCond来匹配所有html类型的http接受标头?

问题描述 投票:0回答:1

我的

.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 接受标头?

apache mod-rewrite http-headers http-accept-header
1个回答
0
投票

通常前端会使用

Accept: application/json
subdomain.example.com/folder/1234
获取请求来加载数据,而无需刷新整个页面(使用 php)。

如果 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 路径,那么这也应该包含在规则中(如上所述)。

其他注意事项...

但是,如果您转到浏览器并导航到

subdomain.example.com/folder/1234
,它应该返回 html 页面以进行 HTML5 路由(使用静态页面)

如果您只是在浏览器中导航到此 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/*
的请求。

© www.soinside.com 2019 - 2024. All rights reserved.