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

Приложение Node.js не загружается, если путь к местоположению не / [закрыт]

По какой-то причине мое приложение Node.js работает на 127.0.0.1:8081 требует /.

Если я начну с этого, ОБЕ / и /projectb могут загрузить страницу.

server {
        listen 80;

        location / {
                proxy_pass http://127.0.0.1:8081;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location /projectb {
                proxy_pass http://127.0.0.1:8081/;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

Когда я меняю его на это, /projectb больше не может полностью загрузить страницу. Когда я смотрю на вкладку сети, некоторые (но не все) запросы не работают, например некоторые изображения, .js, некоторые неправильные конечные точки.

server {
        listen 80;

        location /somethingelse {
                proxy_pass http://127.0.0.1:8080/;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location /projectb {  # I'd expect this to still work.
                proxy_pass http://127.0.0.1:8081/;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

Подводя итог, он работает, когда я напрямую попадаю в порт 123.456.78.910:8081, и когда у меня есть ОБЕИ / и /projectb доверенное лицо http://127.0.0.1:8081/, но не когда я прокси /projectb сам по себе.

Почему это могло быть так?

Из документы nginx на proxy_pass:

Если proxy_pass директива указывается с URI, затем, когда запрос передается на сервер, часть нормализованного URI запроса, соответствующая местоположению, заменяется URI, указанным в директиве:

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

Если proxy_pass указывается без URI, URI запроса передается на сервер в той же форме, что и клиент, когда исходный запрос обрабатывается, или полный нормализованный URI запроса передается при обработке измененного URI:

location /some/path/ {
    proxy_pass http://127.0.0.1;
}

В ваших двух примерах последний предоставляет URI (завершение / в URL-адресе), что приводит к нормализации URI, это приведет к разрыву относительных ссылок в файлах js / css. Удалить /:

server {
        listen 80;

        location /somethingelse {
                proxy_pass http://127.0.0.1:8080;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location /projectb {
                proxy_pass http://127.0.0.1:8081;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}