Я использую S3 для хранения XML-файла и использую CloudFront для распространения этого файла. Я хочу использовать nginx proxy_pass, чтобы найти этот файл без изменения моего доменного имени. например www.mydomain.com/filename.xml URL-адрес S3 для этого файла: https://s3-ap-southeast-2.amazonaws.com/bucketname/bucket-sub-name/filename.xml URL-адрес CDN: https://dev.example.com/filename.xml Если я напишу конфигурацию nginx, как показано ниже, она будет работать нормально.
if($request_uri = "/filename.xml") {
rewrite .* /bucketname/bucket-sub-name$request_uri break;
proxy_pass https://s3-ap-southeast-2.amazonaws.com;
}
Но если я изменил конфигурацию nginx, как показано ниже, это дало мне 502 плохих шлюза.
if($request_uri = "/filename.xml"){
proxy_pass https://dev.example.com$request_uri;
}
или
if($request_uri = "/filename.xml"){
proxy_pass https://s3-ap-southeast-2.amazonaws.com/bucketname/bucket-sub-name$request_uri;
}
Кто-нибудь может объяснить, почему первая работает, а вторая и третья части не работают? Это потому, что в конфигурации CDN что-то не так? Возможно ли, что proxu_pass URL напрямую?
Обе if
и rewrite
директивы являются частью ngx_http_rewrite_module модуль и поведение, которое вы получаете, сильно различаются в зависимости от окружающих их инструкций. Это хорошая идея избегать if
когда ты можешь. В вашем случае вы, вероятно, можете использовать вложенные locations
...
Ваша вторая и третья части, вероятно, не работают, потому что они указывают точные URL-адреса без перезаписи, и эти URL-адреса не правы. Если URL-адреса неверны, вы можете проверить это в error_log Nginx или также с помощью отладочной версии двоичного файла nginx (nginx-debug
) и переключение журнал ошибок из Nginx в debug
.