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

Как я могу использовать proxy_pass для всех адресов после местоположения / с помощью nginx?

Я запускаю приложение node.js под названием обслуживать который показывает файлы и папки с определенного пути моего компьютера на веб-странице:

Это приложение отлично работает само по себе, и я не вижу сообщений об ошибках при попытке доступа к папкам. Однако, когда я пытаюсь запустить его с nginx на месте /page/, Я не могу видеть содержимое каких-либо файлов или папок, и я получаю 404 Not Found ошибка, если я попытаюсь получить к ним доступ. Я использую следующие nginx.conf файл:

events {}

http {
    server {

        listen 80;
        server_name 127.0.0.1;

        location /page/ {
             proxy_pass http://localhost:8070/;
        }

    }
}

И сообщение об ошибке, которое я вижу, следующее:

Судя по всему, страница перенаправляется на localhost/a и нет localhost/page/a когда я пытаюсь получить доступ к папке a. Что мне здесь не хватает? Нужно ли мне использовать другую структуру для перенаправления всего из приложения, работающего на определенном порту, в определенное место (например, /page)?

[Выражение "сервер перенаправляет", когда в контексте HTTP обычно означает"сервер отправляет 30x ответ", поэтому ваш вопрос может ввести в заблуждение.]

Проблема не в том nginx, но обслуживать: проксируемое приложение должно уметь правильно создавать HTML-ссылки. В частности, он должен знать:

  • Какое имя хоста и порт прокси-сервера. Обычно это можно передать в Forward заголовок:

    proxy_set_header Forwarded $proxy_add_forwarded;
    
  • Какой путь к приложению. Обычно это можно настроить в приложении.

В твоем случае обслуживать вероятно, использует абсолютные URI, даже если он не развернут в корне вашего веб-сайта. Вы можете смягчить проблему, указав nginx чтобы изменить возвращенные страницы:

location /page/ {
    sub_filter 'href="/' 'href="/page/';
    sub_filter 'src="/' 'src="/page/';
    proxy_pass http://localhost:8070/;
    proxy_redirect http://localhost:8070/ http://$server_name/page/
}

Однако нет гарантии, что это выражение перепишет все URL-адреса.

Замечание: server_name в вашей конфигурации должно быть доменное имя, а не IP-адрес. Ставить localhost вместо.

Вы можете попробовать доступ http://127.0.0.1 в браузере и посмотрите, работает ли это? Директива server_name соответствует заголовку хоста HTTP как есть и не зависит от разрешения DNS. Если это работает, и вы хотите получить доступ с помощью http: // localhost, пожалуйста, измените директиву server_name на localhost вместо 127.0.0.1