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 С косая черта.