![NGINX 反向代理仅子目录](https://linux22.com/image/755830/NGINX%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E4%BB%85%E5%AD%90%E7%9B%AE%E5%BD%95.png)
我的 Web 应用程序有一个子目录,192.168.1.8:8088/messages
我想将其作为公开给外部世界messages.mysite.com
。我已经完成了一半,但似乎陷入了困境。我的要求如下
- 将站点从 HTTP 重定向到 HTTPS。
- 由于我无法编辑 Web 应用程序生成的链接,因此我需要能够接受来自客户端的请求,例如
messages.mysite.com/messages?id=23023
。 - 不允许反向代理访问根 Web 应用程序,或者其子目录
192.168.1.8:8088
之外的任何子目录。192.168.1.8:8088/messages
我当前的 NGINX 配置存在一些问题。
HTTP 到 HTTPS 重定向仅适用于基本路径。如果收到
messages.mysite.com
类似 的 HTTP 请求,我的服务器会重定向到,这是不正确的。这是因为我在设置中设置了,但如果没有它,我不知道如何重定向到。http://messages.mysite.com/messages?id=23023
http://messages.mysite.com/messages/messages?id=23023
/messages
return 301
messages.mysite.com
192.168.1.8:8088/messages
HTTPS 站点允许访问完整的 Web 应用程序,,
192.168.1.8:8088
但我只希望它访问192.168.1.8:8088/messages
。
我的 NGINX 站点配置文件如下。如能得到任何帮助或指点,我将不胜感激。
server {
listen 80;
server_name messages.mysite.com;
return 301 https://$server_name/messages$request_uri;
}
server {
listen 443 ssl;
server_name messages.mysite.com;
set $upstream 192.168.1.8:8088;
ssl_certificate /etc/letsencrypt/live/messages.mysite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/messages.mysite.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
proxy_pass http://$upstream;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
更新澄清:
例子
https://messages.mysite.com => 192.168.1.8:8088/messages
https://messages.mysite.com/messages?id=23023 => 192.168.1.8:8088/messages?id=23023
https://messages.mysite.com/messages/send_message => 192.168.1.8:8088/messages/send_message
https://messages.mysite.com/calendar => 404
https://messages.mysite.com/notmessages=> 404
答案1
在我看来你混淆了重定向反向代理。
重定向是服务器响应,告诉客户端加载另一个 URL。
反向代理是告诉服务器将请求发送到另一台服务器并将响应返回给客户端。
HTTP 到 HTTPS 的重定向应始终是将 HTTP URL 简单重定向到相应的 HTTPS URL,无需修改。在此步骤中很少需要修改 URL 路径。
因此,您的重定向块应该是:
server {
listen 80;
server_name messages.example.com;
return 301 https://$server_name$request_uri;
}
messages.example.com
要将到达的代理请求反向192.168.1.8:8088/messages
,请使用以下配置:
server {
listen 443 ssl;
server_name messages.example.com;
ssl_certificate /etc/letsencrypt/live/messages.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/messages.example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location = / {
proxy_pass http://192.168.1.8:8088/messages;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /messages {
proxy_pass http://192.168.1.8:8088/messages;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
我删除了变量,因为当和变量彼此相邻$upstream
时,配置更容易读取。location /
proxy_pass
此设置按如下方式转发请求:
https://messages.example.com/ => http://192.168.1.8:8088/messages
https://messages.example.com/?some=value => http://192.168.1.8:8088/messages?some=value
https://messages.example.com/message => http://192.168.1.8:8088/messagesmessage
该proxy_pass
操作记录在nginx 文档