【发布时间】:2016-09-17 15:04:44
【问题描述】:
我的 nginx 配置中有一个简单的 location 块,它匹配我网站的静态文件。我想要做的是使用try_files 检查文件是否存在,如果不存在,则重定向到URL(在这种情况下,在@cdn 位置块中指定)。我还想设置一些 CORS 标头。
下面是相关配置。
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 标头之前,配置工作/工作正常。如果我删除对标头的处理,一切都会按预期工作,并且我会收到 301 响应。
现在我已经阅读了一些关于为什么 if 指令不好并且应该避免使用的内容,但我仍然不知道它为什么会破坏我的配置。如果我理解正确,它与if 或add_header 是重写模块的一部分或类似的东西有关,我猜这与try_files 冲突。也许我在这里不准确,但无论哪种方式我都不确定如何解决它。
为什么在找不到文件时if 和/或add_header 的存在使nginx 给我一个404 而不是301,我该如何解决它?提前致谢!
【问题讨论】:
标签: nginx