У меня есть местоположение
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 сможет найти совпадение немного быстрее.