【问题标题】:How to add additional headers to 302 redirects in Apache?如何在 Apache 中向 302 重定向添加额外的标头?
【发布时间】:2010-10-15 23:41:05
【问题描述】:

我在 Apache 配置中有一个重定向,例如

重定向临时 /foo.xml http://www.baz.com/foo.xml

我正在尝试将 CDN 的 Expire 和 m-cache 标头添加到此 302。这在 php 中是微不足道的,但我需要在 Apache 配置文件中执行此操作。

通常是这样完成的:

过期活动在 ExpiresDefault "访问加 10 分钟"

但这似乎不适用于 302 重定向。有什么建议吗?

【问题讨论】:

  • Apache 配置?通过哪种编程语言?

标签: apache redirect cdn http-status-code-302


【解决方案1】:

请注意 Apache 2.2 中的一个奇怪错误(在 Apache 2.2.15 中观察到),如果您使用 env=HTTPS 来控制何时设置 Header,这会使这变得困难。由于某种原因,env=HTTPS 在重定向期间无法触发,即使 RewriteCond %{HTTPS} on 用于控制重定向。因此,在启用 HTTP 严格传输安全 (HSTS) 的配置中,我使用 RewriteRule 创建一个名为 X_HTTPS 的环境变量,该变量具有与 HTTPS 相同的值,但在 env=X_HTTPS 时未设置为 null被评估:

SetEnv HSTS "max-age=31536000; includeSubDomains; preload"

# For some reason in Apache 2.2, HTTPS env variable is not available during redirects
RewriteCond %{HTTPS} on
RewriteRule ^.*$ - [ENV=X_HTTPS:%{HTTPS}]
# Set HSTS Header if the page is delivered via SSL
Header always set Strict-Transport-Security %{HSTS}e env=X_HTTPS

# Redirect SSL-only non-www page to www and quit
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ https://www.%{SERVER_NAME}%{REQUEST_URI} [R=303,L]

# Redirect ANY non-SSL page to SSL
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=303,L]

【讨论】:

  • 这正是我想要做的。不幸的是,这个解决方案对我不起作用。似乎没有环境变量适用于重定向。我发现的唯一解决方案是省略 env= 子句,该子句有效,但也会在普通 HTTP 请求上发送 Strict-Transport-Security 标头。
【解决方案2】:

查看 Apache 的 mod_headers 模块。

可能是这样的:

<Location /foo.xml>
   Redirect temp /foo.xml http://www.baz.com/foo.xml
   Header always set ExpiresActive On
   Header always set ExpiresDefault "access plus 10 minutes"
</Location>

我已经编辑了这个答案(因为它被接受了),添加了 always 关键字,以反映下面 Fix 正确指出的内容。

【讨论】:

  • 除了,这实际上不起作用,因为重定向完成时没有添加标头。
  • 由于always 指令,这确实有效。请参阅下面的@Fix 答案。它解释得更好。
【解决方案3】:
<Location /foo.xml>
   Redirect temp /foo.xml http://www.baz.com/foo.xml
   Header always set ExpiresActive On
   Header always set ExpiresDefault "access plus 10 minutes"
</Location>

即使使用 HTTP 302 响应(实际上,使用任何 HTTP 响应)也能使其正常工作; 如果没有关键字“always”,则指令“Header set”仅适用于成功响应,即 HTTP 2xx 响应。

【讨论】:

    猜你喜欢
    • 2013-04-06
    • 2018-11-24
    • 2017-12-27
    • 1970-01-01
    • 2019-08-17
    • 2012-04-23
    • 1970-01-01
    • 2011-02-07
    • 2017-02-24
    相关资源
    最近更新 更多