我有 nginx,并且我尝试在双重条件(if)和双重重写中创建规则。
模式是:URL(/direct/file.11223344_aabbcc.js)->如果没有文件-> [是] 重写为 /direct/file_aabbcc.js->如果没有(重写的)文件-> [是] 重写为 /direct/file.js
我在 nginx 的配置文件中写入了这条规则,但是 nginx 执行第一次重写时只发送了 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”的例子并且他无法正常工作。
是的!这很好:
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 也完美了!
谢谢你们!
答案1
将 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”。