nginx 位置中断节点 (sails) 路由
ngnix location breaking node (sails) routes
我一直在寻找correct nginx configuration to achieve a server location (different from /) and get node routes working
。
上下文
- 节点应用 运行 http://localhost:1337
- Nginx 服务器 proxy_pass 指向节点应用程序
- 服务器位置属性/app
- http 请求重定向到 https
Nginx 配置文件
server {
listen 80;
server_name domain.com;
return 301 https://$server_name$request_uri;
}
server {
#listen 80 default_server;
#listen [::]:80 default_server;
listen 443 ssl;
server_name domain.com;
# add Strict-Transport-Security to prevent man in the middle attacks
add_header Strict-Transport-Security "max-age=31536000";
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location /app {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:1337/;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_key sfs$request_uri$scheme;
}
}
问题
当导航到 www.domain.com/app 时,我得到了正确的节点主页。
然后,当请求 www.domain.com/app/test 时,我希望它能带给我 http://localhost:1337/test。那没有发生,我得到的是 404 not found。所以,出于某种原因,the location isn't recognizing node routing
.
奇怪的是,如果位置是 / 而不是 /app,一切都按预期工作。因此,问题可能与位置有关。
可能的修复
我已经尝试在 location 下添加重写,但没有成功:
location /app {
rewrite ^/app(.*) / break;
...
}
您知道为什么会发生这种情况吗?
如果您尝试将 front-end URI /app/test
映射到上游 URI /test
,那么您的 location
上缺少尾随 /
指示。尝试:
location /app/ {
...
proxy_pass http://127.0.0.1:1337/;
...
}
请注意 location
和 proxy_path
都有一个尾随 /
。
当然,这意味着 URI /app
将不再有效,但您可以使用以下方法轻松解决此问题:
location = /app { rewrite ^ /app/ last; }
或:
location = /app { return 301 /app/; }
有关更多信息,请参阅 this document。
我一直在寻找correct nginx configuration to achieve a server location (different from /) and get node routes working
。
上下文
- 节点应用 运行 http://localhost:1337
- Nginx 服务器 proxy_pass 指向节点应用程序
- 服务器位置属性/app
- http 请求重定向到 https
Nginx 配置文件
server {
listen 80;
server_name domain.com;
return 301 https://$server_name$request_uri;
}
server {
#listen 80 default_server;
#listen [::]:80 default_server;
listen 443 ssl;
server_name domain.com;
# add Strict-Transport-Security to prevent man in the middle attacks
add_header Strict-Transport-Security "max-age=31536000";
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location /app {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:1337/;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_key sfs$request_uri$scheme;
}
}
问题
当导航到 www.domain.com/app 时,我得到了正确的节点主页。
然后,当请求 www.domain.com/app/test 时,我希望它能带给我 http://localhost:1337/test。那没有发生,我得到的是 404 not found。所以,出于某种原因,the location isn't recognizing node routing
.
奇怪的是,如果位置是 / 而不是 /app,一切都按预期工作。因此,问题可能与位置有关。
可能的修复
我已经尝试在 location 下添加重写,但没有成功:
location /app {
rewrite ^/app(.*) / break;
...
}
您知道为什么会发生这种情况吗?
如果您尝试将 front-end URI /app/test
映射到上游 URI /test
,那么您的 location
上缺少尾随 /
指示。尝试:
location /app/ {
...
proxy_pass http://127.0.0.1:1337/;
...
}
请注意 location
和 proxy_path
都有一个尾随 /
。
当然,这意味着 URI /app
将不再有效,但您可以使用以下方法轻松解决此问题:
location = /app { rewrite ^ /app/ last; }
或:
location = /app { return 301 /app/; }
有关更多信息,请参阅 this document。