nginx нежелательное перенаправление местоположения с косой чертой в конце

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без завершающего слеша перейти в другое место. Спасибо заранее!

решение1

Существует особый случай, когда a 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/, то относительные пути не будут работать. Некоторые новые браузеры также имеют тенденцию к дефектному UI/UX, который может не отображать завершающий слеш для пользователя, что может еще больше запутать ситуацию при попытке устранения различия.

решение2

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

location /pass {
}

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

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

location = /pass {
}

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

Связанный контент