如果不存在带有“.html”扩展名的文件,我需要知道是否存在带有“.th.html”扩展名的相同文件并进行重定向。
现在,在 404 上我正在执行重写,如果 $request_filename 存在,我就会进行重定向。
try_files $uri $uri/ @thengine;
error_page 404 = @thengine;
location @thengine {
rewrite ^/(.*)\.(htm|html)$ /$1.th.html;
if (-f $request_filename) {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_intercept_errors on;
proxy_redirect off;
proxy_pass http://thengine_backend;
}
}
我想知道是否有更好的方法可以做到这一点而无需重写。
也许类似
if ($request_filename ~ (some rule to replace extension)){...}
谢谢。
编辑:来自浏览器的所有请求都带有.html,但如果带有.html的文件不存在,我必须检查是否存在带有.th.html的相同文件,并且仅在这种情况下进行重定向。
编辑2:假设有人访问domain-nginx.com/path/to/index.html
- nginx 必须检查文件是否存在,如果存在,则显示页面
- 如果文件不存在,则查找 index.th.html
- 如果 index.th.html 不存在,直接给出 404
- 如果 index.th.html 确实存在,请设置一些标题和
serve domain-app.com/path/to/index.th.html
(这里有一个可以处理此类模板的应用程序)
在这段时间内,用户只能看到domain-nginx.com/path/to/index.html
而看不到任何重定向或要更改的 URL。
请注意,.th.html 由另一个应用程序处理
答案1
您不需要error_page
这里的指令,因为您已经有了指令@thengine
的最后一部分try_files
。要回答实际问题,我需要澄清您实际上想要发生什么。
对于您的实际用例,我认为这是最简单的解决方案。您可以@thengine
像这样修改:
location @thengine {
rewrite ^/(.*)\.(htm|html)$ /$1.th.html;
if (-f $request_filename) {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_intercept_errors on;
proxy_redirect off;
proxy_pass http://thengine_backend;
break;
}
return 404;
}
但是,我不能 100% 确定这种配置是否安全,因为有这篇文章:https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/。
nginx 中该指令的当前实现if
很容易引起不必要的副作用,需要对实现进行适当的检查。在阅读了上述文章和解释if
行为的文章后,我仍然不确定这种解决方案是否安全。
可以使用 Lua 脚本实现更安全的解决方案。
答案2
这个应该可以工作。在引擎的帮助下rewrite
。它还不够完整,因为您仍然需要检查是否存在不存在的文件。
location /your_location {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
if (!-e $request_filename) {
rewrite ^/(.*)\.html$ /$1.th.html last;
}
}
错误的答案:
如果你尝试这样的做法会怎样?
try_files $uri.html $uri.th.html =404;