环境:
web: 192.168.1.10:8080
nginx: 192.168.1.100:80frp(内网穿透): 100.123.10.10:18080
frp 使用 tcp 模式,将内网 nginx 端口 80 的 web 服务在开放到外网 100.123.10.10 的 18080 端口。
问题:
在网页登陆成功后,外部 url 的端口却变成称了 80 导致访问失败:
浏览器访问 http://100.123.10.10:18080 后可以正常显示登录界面,通过 f12 查看 network 发现 点击登录按钮后,nginx 返回的端口号为 80 ,也就是 http://100.123.10.10:80 。正常应该返回 http://100.123.10.10:18080 端口才对。在点击登录后手动加上 18080 端口才能正常跳转登录后的页面
Frp 内网穿透配置:
[ test ]
type=tcp
host=192.168.1.100
local_port=80
remote=18080
Nginx 配置:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
sendfile off;
#proxy_redirect default;
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host:$server_port;
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;
proxy_max_temp_file_size 0;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffering off;
proxy_request_buffering off; # Required for HTTP CLI commands
proxy_set_header Connection ""; # Clear for keepalive
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}}}
正常显示为:
1、内网浏览器访问Nginx代理的 80 端口,可以正常显示
2、外网浏览器访问Frp代理后的 18080 端口,可以正常显示
解决方法:
1、(已测试)两个虚拟主机(纯静态-html 支持) - Two Virtual Hosts, Serving Static Files
http {
: server {
: listen 80;
: server_name www.domain1.com;
: access_log logs/domain1.access.log main;
: location / {
: index index.html;
: root /var/www/domain1.com/htdocs;
: }
: }
: server {
: listen 80;
: server_name www.domain2.com;
: access_log logs/domain2.access.log main;
: location / {
: index index.html;
: root /var/www/domain2.com/htdocs;
: }
: }
}
2、(已测试)将 nginx 代理后的 Web应用 Listen port 变更为 18080 ,并且修改 nginx 内的 proxy_pass 即可。
3、(已测试)proxy_set_header Host $host:$server_port; 改为 proxy_set_header Host $http_host;
4、(未测试)Nginx可以 if 判断来源进行重写。
感谢:
coolloves
gam2046
stille
参考:
https://www.nginx.cn/doc/example/virtualhost.html