自定义标头(mod_headers)与 mod_rewrite 结合时不显示

自定义标头(mod_headers)与 mod_rewrite 结合时不显示

我有一个虚拟主机,其中链接了多个域名。我尝试在向某个特定域名发出请求时发送附加标头。

这是我正在做的事情(在 vhost 和 .htaccess 中都尝试过,结果相同)

SetEnvIf HOST thishost THETAG=noindex
Header set X-Robots-Tag "%{THETAG}e" env=THETAG
Header set X-Robots-Test "Yes"

因此,基本上,X-Robots-Test 标头应始终存在。X-Robots-Tag 应仅在 THETAG 标头设置时才存在,而 THETAG 标头仅在主机标头包含“thishost”时才设置。

RewriteRule 看起来像这样,基本上是从页面 1 到页面 2 的 301 重定向

RewriteRule page1 page2 [L,R=301]

当向 page2 发出请求时,标题显示正确,但是当向 page1 发出请求(并由 mod_rewrite 重定向)时,标题不存在(甚至没有测试标题)。

当从 PHP 脚本而不是 mod_rewrite 发起重定向时,它会显示标头,因此我认为问题在于 mod_rewrite 优先于 mod_headers。有什么方法可以解决这个问题吗?

答案1

正如@Zimmi在评论中所说,标头仅适用于“成功”响应(HTTP 2xx 代码)。重定向是 3xx 代码,因此不会获取标头。

如果您正在使用,Header set …则使用Header always set …。如果您正在使用其他操作(添加、附加等),则使用适当的操作。

但请注意,你不应该盲目地“始终设置”。从文件

在与下列情况类似的情况下,可能需要将 onsuccess 的默认值更改为 always。另请注意,在某些情况下,在两种条件下重复此指令是有意义的,因为对于现有标头而言,always 不是 onsuccess 的超集:

您正在向非成功(非 2xx)响应(例如重定向)添加标头,在这种情况下,最终响应中仅使用与 always 对应的表。您正在修改或删除由 CGI 脚本生成的标头,在这种情况下,CGI 脚本位于与 always 对应的表中,而不是在默认表中。您正在修改或删除由服务器的某些部分生成的标头,但默认的 onsuccess 条件未找到该标头。

对于 HSTS 标头(这就是我试图添加到域规范化的内容),这似乎是正确的方法。

相关内容