如果url / file不存在,nginx将从本地服务器提供不同的文件名

有没有办法如果文件不存在服务器另一个app-*.js文件在其他文件夹中,例如:

转到url: http : //www.example.com/assets/build/app/app-48fee50a26.js

我收到以下错误信息:

 [error] 17788#17788: *1 open() "/var/app/assets/build/app/app-48fee50a26.js" failed (2: No such file or directory), client: , server: , request: "GET /assets/build/app/app-48fee50a26.js HTTP/1.1", host:"" 

我想在相同的文件夹/var/app/assets/build/app/提供其他任何js文件,但其他文件的名称可以不断更改,例如app-62a5962b0a11.js 。 我正在考虑app\-(.*)\.js

以下所有示例都不起作用:

 server { listen 80 default_server; root /var/app; location /assets/build/app/app\-(.*)\.js { try_files $uri $uri/ /assets/build/app/app\-(.*)\.js; } } server { listen 80 default_server; root /var/app; location /assets/build/app/app\-(.*)\.js { try_files $uri $uri/ /var/app/assets/build/app/app\-(.*)\.js; } } Also not working without regex to the location of the other file. server { listen 80 default_server; root /var/app; location /assets/build/app/app\-(.*)\.js { try_files $uri $uri/ /var/app/assets/build/app/app-62a5962b0a11.js; } } server { listen 80 default_server; root /var/app; location /assets/build/app/app\-(.*)\.js { try_files $uri $uri/ /assets/build/app/app-62a5962b0a11.js; } } 

您的location指令语法是错误的。 如果要指定正则expression式,则必须使用~~*修饰符。 详情请参阅此文件 。

另外,你不能指望nginx寻找一个匹配模式的随机文件。 这意味着你的最后一次尝试是最接近一个工作的解决scheme。 例如:

 location ~ ^/assets/build/app/app-.+\.js$ { try_files $uri /assets/build/app/app-62a5962b0a11.js =404; } 

我添加了=404作为默认的术语,以避免在app-62a5962b0a11.js不存在的情况下产生循环。 但一般来说, app-62a5962b0a11.js必须存在才能正常运行。 请参阅此文档以获取try_files语法。