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

Nginx - перезапись и pass_proxy на другой порт, причина 404 не найдена

Попытка разрешить переопределение URL-адресов работать вместе с переадресацией портов, но это, похоже, не работает.

Мой сервер приложений работает на :8080 порт в то время как nginx работает по умолчанию 80 один. Поэтому я вынужден не только переписывать URL-адреса, но и перенаправлять запрос на другой порт.

Собственно, единственное, что я пытаюсь сделать, это запросить существующий ресурс http://localhost:8080/#/cat/tom по его ярлыку http://localhost/tom без перенаправления.

Вот что я сделал на основе nginx док и другие вопросы:

server {
    listen       80;
    server_name  localhost;
    root /;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        rewrite ^/([a-z]+)$ /#/cat/$1 break;
        proxy_pass http://localhost:8080;
        proxy_redirect off;
    }

    ...
}

Пробовали другие конфигурации, но ни одна из них не работает. Когда я получаю доступ к http://localhost/tom это говорит 404 not found в то время http://localhost:8080/#/cat/tom работает как положено.

В журналах нет упоминания об ошибках.

Как заставить эту работу работать как положено?

Переписывание nginx работает только с частью пути URL. Это не работает с частью запроса, которая разделена ? и не работает на части, разделенной #, который является фрагментом.

Собственно, при входе в ваш http://localhost:8080/#/cat/tom URL в ваш браузер, ваш браузер отправляет запрос на получение http://localhost:8080/, и ваш браузер обрабатывает часть после #сам по себе.

Итак, вам нужно выяснить, как именно ваше прикладное программное обеспечение работает с этими частями фрагмента, и на основе этого создать конфигурацию.

Проблема в том, что #/cat/tom - это инструкция для клиентского приложения, а не для серверного. Это означает, что его нужно отправить клиенту (через перенаправление).

Например:

location = /tom {
    return 302 /#/cat/tom;
}
location / {
    proxy_pass http://localhost:8080;
    ...
}

Вы упоминаете в своем вопросе, что пытаетесь сделать это без перенаправления, но, к сожалению, если вы посмотрите на структуру URL-адреса, вы заметите, что все, что находится после # не отправляется на сервер. Видеть этот документ для большего.