Я запускаю приложение 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