У меня есть следующая (отредактированная для простоты) конфигурация nginx:
server{
location ~ /saml/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
proxy_pass https://acme.com;
}
location / {
try_files $uri $uri/ /index.html;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
proxy_pass https://acme.com;
}
}
Как видите, у меня определены два местоположения. Единственное различие между ними состоит в том, что любой URL, содержащий / SAML / *, не получит строку try_files
.
Все остальное то же самое. Есть ли более чистый и управляемый способ написать это?
Многие директивы в Nginx могут быть унаследованы из окружающего контекста. Вам нужны только операторы proxy_pass
и try_files
в определенных блоках location
.
Например:
server{
root ...;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
location ~ /saml/ {
proxy_pass https://acme.com;
}
location / {
try_files $uri $uri/ /index.html;
proxy_pass https://acme.com;
}
}
В качестве альтернативы можно поместить общие операторы в отдельный файл и используйте оператор include
. Подробнее см. этот документ .