我想要无 cookie 的子域名,以改善 yslow,
我可以在 htaccess 中检查正在使用的主机名吗?
在我的例子中,如果调用 www-static.example.com,那么我想设置
AddDefaultCharset UTF-8
ServerSignature Off
Options -Indexes
FileETag none
<IfModule mod_headers.c>
Header unset ETag
Header unset Cookie
Header unset Set-Cookie
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
</IfModule>
<IfModule mod_expires.c>
ExpiresActive on
</IfModule>
<FilesMatch "\.(ico|jpg|jpeg|jpe|png|gif)$">
ExpiresDefault "access plus 2 years"
</FilesMatch>
<IfModule mod_expires.c>
ExpiresByType image/x-icon "access plus 2 years"
ExpiresByType image/ico "access plus 2 years"
ExpiresByType image/gif "access plus 2 years"
ExpiresByType image/jpg "access plus 2 years"
ExpiresByType image/jpe "access plus 2 years"
ExpiresByType image/jpeg "access plus 2 years"
ExpiresByType image/png "access plus 2 years"
</IfModule>
但当我访问 www.example.com 时我不希望设置此项
答案1
<If>
在 Apache 2.4+ 上,您可以尝试使用 Apache 表达式将整个指令块放在一个块中,以测试所请求的主机名。
例如:
<If "%{HTTP_HOST} == 'www-static.example.com'">
# :
# Directives go here...
# :
</If>
关于您现有指令的一些说明:
<IfModule mod_headers.c> Header unset ETag Header unset Cookie Header unset Set-Cookie </IfModule>
似乎没有必要将所有块都包裹在<IfModule>
包装器中。
Cookie
是要求标题,因此您需要使用RequestHeader
指令,而不是Header
(适用于回复标头)。但是,一开始就不应该在此域上设置 cookie,因此这应该是不必要的(并且首先违背了拥有无 cookie 域的意义)。同样,取消设置应该Set-Cookie
是不必要的,因为它一开始就不应该被设置。
<IfModule mod_rewrite.c> RewriteEngine On </IfModule>
除非您的意图是覆盖父配置中的 mod_rewrite 指令,否则这似乎是不必要的?
<IfModule mod_expires.c> ExpiresActive on </IfModule> <FilesMatch "\.(ico|jpg|jpeg|jpe|png|gif)$"> ExpiresDefault "access plus 2 years" </FilesMatch> <IfModule mod_expires.c> ExpiresByType image/x-icon "access plus 2 years" ExpiresByType image/ico "access plus 2 years" ExpiresByType image/gif "access plus 2 years" ExpiresByType image/jpg "access plus 2 years" ExpiresByType image/jpe "access plus 2 years" ExpiresByType image/jpeg "access plus 2 years" ExpiresByType image/png "access plus 2 years" </IfModule>
容器内部和外部都有 mod_expires 指令<IfModule>
- 这实际上没有意义。此外,您还有一个ExpiresDefault
文件扩展名指令,这些指令已被更具体的指令所涵盖ExpiresByType
。ExpiresDefault
应该用作任何其他指令的默认值静态资源由该主机提供服务。
顺便说一句,jpg/jpeg/jpe 文件的正确 mime 类型是image/jpeg
。因此,其他两个相关的 mime 类型(image/jpg
和image/jpe
)是多余的 - 您的服务器无论如何只会返回其中之一,因此您可以通过查看服务器发回的 HTTP 响应来仔细检查。
因此,你的 mod_expires 指令应该像这样写:
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/x-icon "access plus 2 years"
ExpiresByType image/ico "access plus 2 years"
ExpiresByType image/gif "access plus 2 years"
ExpiresByType image/jpeg "access plus 2 years"
ExpiresByType image/png "access plus 2 years"
ExpiresDefault "access plus 2 years"
</IfModule>
请注意,如果所有静态资源都将是“访问加 2 年”,那么您只严格需要该ExpiresDefault
指令。