如果服务器名称是 www-static.example.com,则设置 htaccess 条件

如果服务器名称是 www-static.example.com,则设置 htaccess 条件

我想要无 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文件扩展名指令,这些指令已被更具体的指令所涵盖ExpiresByTypeExpiresDefault应该用作任何其他指令的默认值静态资源由该主机提供服务。

顺便说一句,jpg/jpeg/jpe 文件的正确 mime 类型是image/jpeg。因此,其他两个相关的 mime 类型(image/jpgimage/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指令。

相关内容