gpt4 book ai didi

nginx - 如果条件破坏了 nginx 配置中的 try_files

转载 作者:行者123 更新时间:2023-12-04 14:56:07 28 4
gpt4 key购买 nike

我有一个简单的location在我的 nginx 配置中阻止与我的网站的静态文件匹配。我想要做的是使用 try_files 检查文件是否存在,如果没有,则重定向到一个 URL(在这种情况下,在 @cdn 位置 block 中指定)。我还想设置一些 CORS header 。

下面是相关配置。

location ~* \.(css|js|jpe?g|png|gif|otf|eot|svg|ttf|woff|woff2|xml|json)$ {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;

return 204;
}

if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
}

if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
}

try_files $uri @cdn;
}

location @cdn {
return 301 https://example.com$request_uri;
}

问题是如果文件不存在,我会收到 404 响应,而不是 301 重定向。在添加 CORS header 之前,配置工作/工作正常。如果我删除对 header 的处理,一切都会按预期工作,并且我会收到 301 响应。

现在我已经阅读了一些关于为什么 if 指令不好并且应该避免使用的内容,但我仍然不知道它为什么会破坏我的配置。如果我理解正确,它与 if 中的任何一个都有关。或 add_header作为重写模块或类似模块的一部分,我猜这与 try_files 冲突.也许我在这里不准确,但无论哪种方式我都不确定如何解决它。

为什么 if的存在和/或 add_header当找不到文件时,让 nginx 给我一个 404 而不是 301,我该如何解决?提前致谢!

最佳答案

http://agentzh.blogspot.co.uk/2011/03/how-nginx-location-if-works.html您可能有兴趣了解 if作品。在您的情况下,当 if条件匹配,请求现在在 if上下文和 try_files不被该上下文继承。或作为 https://www.digitalocean.com/community/tutorials/understanding-the-nginx-configuration-file-structure-and-configuration-contexts说“使用 if 上下文时要记住的另一件事是它使同一上下文中的 try_files 指令无用。”

此外,如果 try_files回退到 @cdn那么您之前添加的任何标题都会被遗忘,它会在新的 location 中重新开始 block ,因此需要在此处添加标题。

至于如何解决它;您可以在 if 中设置变量, 和 add_header忽略一个空值,所以这样的事情应该可以工作:

set $access-control-output 0;
location ~* \.(css|js|jpe?g|png|gif|otf|eot|svg|ttf|woff|woff2|xml|json)$ {
set $access-control-output 1;
try_files $uri @cdn;
}

set $acao = "";
set $acam = "";
if ($access-control-output) {
set $acao = $http_origin;
set $acam = "GET, OPTIONS";
}

map "$access-control-output:$request_method" $acma {
"1:OPTIONS" 1728000;
default "";
}

location @cdn {
add_header 'Access-Control-Allow-Origin' $acao;
add_header 'Access-Control-Allow-Methods' $acam;
add_header 'Access-Control-Max-Age' $acma;
return 301 https://example.com$request_uri;
}

编辑:您不关心@cdn 后备中的 header ,在这种情况下,您应该能够拥有这样的东西:
map $request_method $acma {
"OPTIONS" 1728000;
default "";
}

location ~* \.(css|js|jpe?g|png|gif|otf|eot|svg|ttf|woff|woff2|xml|json)$ {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Methods' "GET, OPTIONS";
add_header 'Access-Control-Max-Age' $acma;
try_files $uri @cdn;
}

location @cdn {
return 301 https://example.com$request_uri;
}

关于nginx - 如果条件破坏了 nginx 配置中的 try_files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39548301/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com