nginx и Слэша с прокси-пасс
Я использую следующую конфигурацию для nginx 1.4.1:
server { listen 8000; server_name correct.name.gr; location /test/register { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1; } }
то, что я хочу сделать, это когда пользователь вист http://correct.name.gr:8000/test/register/
они должны быть проксированы apache, который работает на порту 80.
когда я посещаю http://correct.name.gr:8000/test/register/
Я получаю правильные результаты (индекс.РНР.)
Когда я посещаю http://correct.name.gr:8000/test/register/asd
Я получаю правильные результаты (404 от apache).
Когда я посещаю http://correct.name.gr:8000/test/asd
Я получаю правильные результаты (404 от nginx).
Когда я посещаю http://correct.name.gr:8000/test/register123
я получаю правильные результаты (404 с апаш.)
проблема в том, когда я посещаю http://correct.name.gr:8000/test/register
. Я получаю ответ 301, и я перенаправлен на http://localhost/test/register/
(обратите внимание на косую черту и конечно же локальным 'localhost')!!!
Я не делал никаких других конфигураций для nginx, чтобы поставить конечные косые черты или что-то подобное. Знаешь, в чем проблема ? Я хочу!--6--> правильно работать, проксируя apache (или, если не возможно, по крайней мере, выдать ошибку 404, а не перенаправить на localhost пользователь.)
обновление 1: Я пробовал http://correct.name.gr:8000/test/register
С другого компьютера, чем тот, с которым у меня вчера было плохое поведение.. Ну, это сработало: я только что получил ответ 301, который указал мне на правильный http://correct.name.gr:8000/test/register/
! Как можно работать с одного компьютера, но не с другого (я использую один и тот же браузер-Chrome на обоих компьютерах)? Я попробую еще раз завтра проверить с третьего, чтобы увидеть поведение.
спасибо !
2 ответов
Я предполагаю, что ваш вышестоящий сервер (либо apache, либо ваш скрипт) вызвал перенаправление на абсолютное URL-адресом http://localhost/test/register/
. Потому что вы используете http://127.0.0.1
в своем proxy_pass
директива, nginx не находит совпадения с доменным именем и возвращает Location
заголовок как есть.
Я думаю, что правильное решение-не использовать абсолютное перенаправление, если перенаправление на внутренний url. Это всегда хорошая практика.
однако, без изменения вышестоящего сервера, есть два быстрых решения.
можно использовать
proxy_pass http://localhost;
это скажет nginx, что доменное имя upstream -localhost
. Тогда nginx будет знать, чтобы заменить http://localhost
by http://correct.name.gr:8000
когда он находит эту часть в Location
заголовок вверх по течению.
еще один-добавить proxy_redirect
строка, чтобы заставить nginx переписать любой заголовок местоположения с http://localhost/
в нем.
proxy_pass http://127.0.0.1;
proxy_redirect http://localhost/ /;
Я предпочитаю первое решение, потому что это проще. Нет DNS поиск накладных расходов использования proxy_pass http://localhost;
потому что nginx делает запрос заранее, когда он запускает веб-сервер.
ссылка:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect
вы уже пробовали играть с server_name_in_redirect?
тем не менее, я нашел вас вопрос через google, потому что я запускаю ту же проблему с конечной косой чертой. Nginx заставляет 301 к тому же URL С косая черта.