nginx обслуживает статические файлы напрямую, если они не соответствуют правилам перезаписи
Я только что перешел с Apache на Nginx, и я борюсь с некоторыми параметрами конфигурации, которые, кажется, не работают. У меня есть эти правила из моего предыдущего файла.htaccess, который я пытаюсь преобразовать в правила nginx:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(js|css)/([a-z0-9\.]+)\.(js|css)$ $1/index.php?hash=$2 [L,QSA]
RewriteCond %{REQUEST_URI} !\.(gif|jpe?g|s?html|css|js|cgi)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
Как вы можете сказать, это говорит о том, что каждый файл, который не существует, но следует указанному шаблону, должен обслуживаться сценарием php. Никакой дальнейшей обработки. Затем для каждого файла, который не является статичным и не существует на диске, отправьте их в основной файл index.php.
Я знаю, как обслуживать статические файлы напрямую, и я знаю, как сделать первое правило. Единственное, что я не знаю, как решить, это совместить оба эти условия. Вот что у меня так далеко:
location / {
try_files $uri $uri/ /index.php;
}
location /js/ {
rewrite ^/js/([a-z0-9.]+).js$ /js/index.php?hash=$1 break;
}
location /css/ {
rewrite ^/css/([a-z0-9.]+).css$ /css/index.php?hash=$1 break;
}
# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
access_log off;
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
}
location ~ \.php$ {
# basic settings for php files
}
Как я уже сказал, если я оставлю все эти три location
директивы включены, статические файлы будут обслуживаться напрямую, но стили или js-файлы, которые следуют указанному шаблону, будут возвращать ошибку 404 (так как они не найдены в этом конкретном месте). Если я прокомментирую директиву static files и включу правила перезаписи для css/js, которые должны обслуживаться скриптом, статические файлы внутри каталогов css/js не будут обслуживаться (возвращается пустая страница), но все остальные статические файлы будут подается нормально.
Я действительно не знаю, что делать дальше. Я часами смотрел в интернете, как решить эту проблему, но все, что я пробовал, не сработало.
1 ответ
Решение:
location / {
try_files $uri $uri/ /index.php;
}
# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
access_log off;
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
try_files $uri @fallback;
}
location @fallback {
rewrite ^/(js|css)/([a-z0-9.]+)\.(js|css)$ /$1/index.php?hash=$2;
}
location ~ \.php$ {
# basic settings for php files
}