0

I have nginx and I trying create rule in the double condition (if) and double rewrite.

The schema is: URL (/direct/file.11223344_aabbcc.js) -> if no file -> [Yes] rewrite to /direct/file_aabbcc.js -> if no (rewrited) file -> [Yes] rewrite to /direct/file.js

I write in the config-file nginx this rules, but nginx exec first rewrite only and send error 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;
}

In log-file out this messages:

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"

Double if not work (down nginx). Double rewrite too (second rewrite use first requiest).

In the Apache this rules worked perfectly:

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]

Please, help me make up rules with double processing rewrites/conditions.

In Google I find examples without "if" only and his not work normally.


Yes! This is good:

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;
}

And now nginx perfectly too!

Thank you all!

Piknik
  • 53
  • 5

1 Answers1

0

Use try_files in combination with a named location, like

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;
}

Edit: updated answer to actually do what you aked for: try different rewrites in order. The trick is to use "error_page 404" pointing to a 2nd named location.

T. Kuther
  • 196
  • 4