Назад | Перейти на главную страницу

установить условие htaccess, если имя сервера www-static.example.com

Мне нужен субдомен без файлов 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, я не хочу, чтобы это устанавливали

На Apache 2.4+ вы можете попробовать поместить весь блок директив в <If> блокировать с помощью выражения 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 следует использовать по умолчанию для любых других статические ресурсы которые обслуживаются этим хостом.

Кстати, правильный MIME-тип для файлов jpg / jpeg / jpe - 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 директива.