我在 Apache 配置中有一个重定向,例如
重定向临时 /foo.xml http://www.baz.com/foo.xml
我正在尝试将 CDN 的 Expire 和 m-cache 标头添加到此 302。这在 php 中是微不足道的,但我需要在 Apache 配置文件中执行此操作。
通常这样做是这样的:
ExpiresActive On ExpiresDefault "access plus 10 minutes"
但这似乎不适用于 302 重定向。有什么建议么?
我在 Apache 配置中有一个重定向,例如
重定向临时 /foo.xml http://www.baz.com/foo.xml
我正在尝试将 CDN 的 Expire 和 m-cache 标头添加到此 302。这在 php 中是微不足道的,但我需要在 Apache 配置文件中执行此操作。
通常这样做是这样的:
ExpiresActive On ExpiresDefault "access plus 10 minutes"
但这似乎不适用于 302 重定向。有什么建议么?
<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 响应。
请注意 Apache 2.2 中的一个奇怪的错误(在 Apache 2.2.15 中观察到),如果您env=HTTPS
用于控制何时设置 Header,这会使这变得困难。由于某种原因env=HTTPS
,在重定向期间无法触发,即使使用RewriteCond %{HTTPS}
on 来控制重定向。因此,在启用 HTTP 严格传输安全 (HSTS) 的配置中,我使用 RewriteRule 创建一个名为的环境变量,该变量X_HTTPS
具有与 相同的值,但在评估HTTPS
时未设置为 null :env=X_HTTPS
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]
查看 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 正确指出的内容。