У меня есть nginx, и я пытаюсь создать правило в двойном условии (если) и двойной перезаписи.
Схема такая: URL (/direct/file.11223344_aabbcc.js) -> если файла нет -> [Да] переписать в /direct/file_aabbcc.js -> если нет (переписанного) файла -> [Да] переписать в / direct /file.js
Я пишу в конфигурационном файле nginx эти правила, но nginx exec сначала только перезаписывает и отправляет ошибку 404.
if (!-e $request_filename) {
rewrite ^/([a-zA-Z0-9\-\_\\\/]*)\.[0-9]+(\_[a-z0-9]+)*\.(js|css)$ /$1$2.$3 break;
}
if (!-e $request_filename) {
rewrite ^/([a-zA-Z0-9\-\_\/\\\.]*)\_[a-z0-9]+\.(js|css)$ /$1.$2 break;
}
В лог-файле выводим сообщения:
2016/10/14 10:45:25 [notice] 13676#0: *1 "^/([a-zA-Z0-9\-\_\\/]*)\.[0-9]+(\_[a-z0-9]+)*\.(js|css)$" matches "/direct/file.11223344_aabbcc.js", client: 10.0.0.10, server: 10.0.0.1, request: "GET /direct/file.11223344_aabbcc.js HTTP/1.1", host: "10.0.0.1"
2016/10/14 10:45:25 [notice] 13676#0: *1 rewritten data: "/direct/file_aabbcc.js", args: "", client: 10.0.0.10, server: 10.0.0.1, request: "GET /direct/file.11223344_aabbcc.js HTTP/1.1", host: "10.0.0.1"
2016/10/14 10:45:25 [error] 13676#0: *1 open() "/var/www/html/direct/file_aabbcc.js" failed (2: No such file or directory), client: 10.0.0.10, server: 10.0.0.1, request: "GET /direct/file.11223344_aabbcc.js HTTP/1.1", host: "10.0.0.1"
Удвойте, если не работает (на nginx). Двойная перезапись тоже (вторая перезапись используется первым).
В Apache эти правила работали отлично:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9\-\_\/\\]*)\.[0-9]+(\_[a-z0-9]+)*\.(js|css)/?$ $1$2.$3 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9\-\_\/\\\.]*)\_[a-z0-9]+\.(js|css)/?$ $1.$2 [L,QSA]
Помогите, пожалуйста, составить правила с двойной обработкой рерайтов / условий.
В Google я нахожу примеры без "если" только и его не работают нормально.
Да! Это хорошо:
if (!-e $request_filename) {
rewrite ^/([a-zA-Z0-9\-\_\\\/]*)\.[0-9]+(\_[a-z0-9]+)*\.(js|css)$ /$1$2.$3 last;
rewrite ^/([a-zA-Z0-9\-\_\/\\\.]*)\_[a-z0-9]+\.(js|css)$ /$1.$2 break;
}
И теперь nginx тоже отлично!
Спасибо вам всем!
Используйте try_files в сочетании с именованным местоположением, например
location ~* \.(js|css)$ {
try_files $uri @try1;
}
location @try1 {
rewrite ^/([a-zA-Z0-9\-\_\\\/]*)\.[0-9]+(\_[a-z0-9]+)*\.(js|css)$ /$1$2.$3;
error_page 404 = @try2;
}
location @try2 {
rewrite ^/([a-zA-Z0-9\-\_\/\\\.]*)\_[a-z0-9]+\.(js|css)$ /$1.$2;
}
Изменить: обновленный ответ, чтобы на самом деле сделать то, что вы просили: попробуйте разные переписывания по порядку. Уловка состоит в том, чтобы использовать "error_page 404", указывающую на 2-е именованное местоположение.