Я использую программное обеспечение для управления сервером plesk с apache и nginx. Я установил в apache и nginx заголовок с истекшим сроком действия для файлов javascript на один год. Это работает. Я вижу один год для "expires" в заголовке.
Теперь я хочу получить доступ к файлам javascript и php с перезаписью (без перенаправления).
APACHE
ExpiresActive On
ExpiresByType text/javascript A31556952
RewriteEngine On
RewriteRule fake/(.+\.(?:js|php))$ original/$1 [L]
NGINX
location ~* ^/(.*\.js)$ {
try_files $uri @fallback;
expires 1y;
add_header Cache-Control "public";
}
Это RewriteRule работает. Я могу получить доступ к этим файлам, но заголовок «expires» в «fake/file.js» исчез. Что я делаю не так?
example.com/original/file.js = истекает через год
example.com/fake/file.js = нет заголовка для expires
SOLUTION Все статические файлы обычно обрабатываются NGINX, а не apache. Поэтому установите в apache эту строку для javascript, дайте ему кэш.
Набор заголовков Cache-Control "max-age=31556952, public"
Флаг [L] в RewriteRule должен остановить обработку статических файлов nginx, а ExpiresByType игнорируется.
почему статические файлы вообще не обрабатываются nginx?
Потому что /fake/file.js
больше не является «статическим файлом» (это не существует), поэтому передается в Apache, где он внутренне переписывается, чтобы получить требуемый ответ.
ExpiresByType text / javascript A31556952
text / javascript
может быть неправильным mime-типом для ответов JavaScript на вашем сервере . Вам необходимо подтвердить, какой тип mime (например, заголовок Content-Type
) ваш сервер отправляет обратно с этими ответами, но в наши дни обычно это application / javascript
.Другими словами:
ExpiresByType application/javascript A31556952
Чтобы уточнить, mod_expires ExpiresByType
устанавливает заголовки HTTP-ответа Expires
и Cache-Control: max-age
. Cache-Control: max-age
имеет приоритет во всех современных браузерах. Expires
действительно только для поддержки устаревших версий.
Флаг [L] в RewriteRule должен останавливать обработку статических файлов с помощью nginx
Флаг L
просто останавливает текущий проход механизма перезаписи на Apache. Сами по себе эти директивы не влияют на Nginx (который, похоже, действует как интерфейсный прокси).