Назад | Перейти на главную страницу

Перенаправление нежелательного местоположения nginx с завершающей косой чертой

У меня есть место

location /pass/ {
    proxy_pass http://localhost:12345/;
}

Так предполагается проксировать URL http://example.com/pass/whatever к http://localhost:12345/whatever

Что мне не нравится в этом, так это то, что nginx автоматически добавляет косую черту к

http://example.com/pass

и делает это http://example.com/pass/ через 301 редирект

Как я могу просто избежать такого поведения. я хочу /pass без косой черты, чтобы перейти в другое место. Заранее спасибо!

Есть особый случай, когда proxy_pass с location кончающийся на / приведет к автоматическому неявному 301 перенаправить без перехода на бэкэнд; вы должны создать явный location без косой черты в конце, чтобы этого избежать:

Если местоположение определяется строкой префикса, которая заканчивается символом косой черты, и запросы обрабатываются одним из proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass или grpc_pass, то выполняется специальная обработка. В ответ на запрос с URI, равным этой строке, но без косой черты в конце, постоянное перенаправление с кодом 301 будет возвращено на запрошенный URI с добавленной косой чертой. Если это нежелательно, точное соответствие URI и местоположения можно определить следующим образом:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}

Например, вам нужно создать явное /pass location в дополнение к существующим /pass/ один, в противном случае неявный location /pass {return 301 /pass/…;} будет создан для вас.

Однако уверены ли вы, что действительно хотите делать то, что пытаетесь сделать? Если вы собираетесь опустить перенаправление с /pass к /pass/, тогда относительные пути не будут работать. Некоторые новые браузеры также имеют тенденцию показывать дефектный интерфейс / пользовательский интерфейс, который может не отображать конечную косую черту для пользователя, что может еще больше запутать при попытке устранить различие.

Как вы хотите, чтобы он пошел другое место, естественное решение - добавить это местоположение

location /pass {
}

По умолчанию nginx будет искать файл с именем pass в корневом веб-каталоге. Если вам не нравится это значение по умолчанию, вы можете добавить больше директив в этот новый блок местоположения для достижения этого.

Вы также можете использовать

location = /pass {
}

так что nginx может найти совпадение немного быстрее.