次の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
がリクエストされたときにlocalhost:8080/v1/healthcheck
を提供したいと思います。ただし、localhost:8080/v1/healthcheck.json
を明示的にヒットしていない場合、nginxはjsonファイルの提供を拒否します。それ以外の場合は、ログファイルが見つからず、応答はnginxの404ページです。 URLの最後に.jsonを追加すると、ファイルが魔法のように見つかり、素晴らしい魔法が起こります。 application/json
タイプを強制し、try files
行を変更して、返したいファイルを明示的に返すようにしたので(try_files healthcheck.json =404;
を設定したため)、すべて同じ問題が返されます。
私はかなり迷っています。誰かアイデアはありますか?
これは実際には、この構成で予想される動作です。つまり、あなたがやっていることは、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;
}