我有一个开发情况,其中我有一个包含多个服务的域:
https://somewebpage.com
此服务上有多个项目作为子目录
https://somewebpage.com
<- 登陆页面https://somewebpage.com/api
<- rest api 服务器https://somewebpage.com/app
<- 我的应用程序
那么,是否有可能(以及如何)设置 nginx 和 hosts 文件以仅对https://somewebpage.com/app
我的本地构建进行反向代理http://localhost:3000
?
/api
问题是,当应用程序部署时,访问其他服务器没有问题,但是在本地提供服务时,我的 nginx 反向代理也会拦截landing page
和rest api server
URL。
我的 nginx 配置如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
index index.html;
proxy_max_temp_file_size 0;
proxy_buffering off;
server {
listen 80;
server_name somewebpage.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name somewebpage.com;
ssl_certificate /etc/ssl/certs/certificate.crt;
ssl_certificate_key /etc/ssl/certs/ccertificate.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location /app {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass http://localhost:3000;
}
}
}
在我的/etc/hosts
我有:
127.0.0.1 somewebpage.com
还有其他技巧可以达到类似的效果吗?
我尝试这样做的原因是,如果我从我的电脑上执行此操作,localhost:3000
它将响应CORS
错误并拒绝我的呼叫/api
。
或者这是否存在太大的安全隐患,我必须寻求其他的访问方式/api
?
提前感谢您的回答。
答案1
您需要添加以下内容:
location / {
try_files $uri $uri/ =404;
}
这告诉 nginx 如何处理与其他指定不匹配的请求location
。有关 nginx 如何选择location
要使用的块的更多信息,请阅读nginx 文档。
答案2
我想到了一个对我有用的解决方案。
somewebpage.com
指向xx.xx.xx.xx
静态 IP 地址,所以我只需添加另一个代理转发到该 IP 地址,而不是类似于 Tero Kilkanen 答案的 URL。
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass https://xx.xx.xx.xx;
}
这样,/etc/hosts
文件就不会拦截我的somewebpage.com
请求,因为请求将绕过域解析。
因此,最终我得到了以下对我有用的 nginx 配置:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
index index.html;
proxy_max_temp_file_size 0;
proxy_buffering off;
server {
listen 80;
server_name somewebpage.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name somewebpage.com;
ssl_certificate /etc/ssl/certs/certificate.crt;
ssl_certificate_key /etc/ssl/certs/ccertificate.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location /app {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass http://localhost:3000;
}
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass https://xx.xx.xx.xx;
}
}
}
由于幕后有多个 IP 地址或动态 IP 地址或其他原因,此解决方案可能不适用于所有人。但它对我来说是有效的,并且对于开发目的来说已经足够好了。