双重重写请求

双重重写请求

我有 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”。

相关内容