我有以下 nginx.conf 文件:
server {
listen 8080;
server_name dummy_server;
root /usr/share/nginx/html;
location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
default_type 'application/json';
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Content-Type' 'application/json';
if ($request_uri ~* "([^/]*$)" ) {
set $last_path_component $1;
}
try_files $last_path_component.json $last_path_component.json =404;
}
}
我希望在请求healthcheck.json
时提供服务。但是,如果我没有明确点击,nginx 会拒绝提供任何 json 文件,否则它会记录文件未找到,并且响应是 nginx 的 404 页面。如果我在 url 末尾添加 .json,则会神奇地找到该文件,然后发生伟大的奇迹。我尝试强制类型,以及更改行以明确返回我想要返回的文件(所以我设置了),所有这些都返回了相同的问题。localhost:8080/v1/healthcheck
localhost:8080/v1/healthcheck.json
application/json
try files
try_files healthcheck.json =404;
我很迷茫......有人有什么想法吗?
答案1
这实际上是此配置的预期行为。因此,您要做的就是删除 URL,然后将其传递给try_files
。
但是 中没有任何内容try_files
可以处理没有扩展名的文件。为此,请像这样修改它
try_files $last_path_component $last_path_component.json $last_path_component.json =404;
这将允许您提供.json
不带扩展名的文件。然而,这将不会提供.json
带或不带扩展名的相同文件。该try_files
指令检查文件是否存在并按此顺序提供它们。因此,如果您有healthcheck.json
并尝试通过它访问它,localhost:8080/v1/healthcheck
它仍然会失败。因此,您需要让healthcheck
端点实际上在服务器上没有扩展名才能访问它。
如果您想处理这两种变体(带或不带扩展),您可能需要.json
先像这样剥离部分
if ($request_uri ~ ^/([^?]*)\.json(\?.*)?$) {
return 302 /$1$2;
}
try_files $uri $uri.json =404;
}