家庭宽带是屏蔽了80/443端口访问的,所以如果想要从外面访问内部的nginx服务器,就必须使用其他端口。可以使用nginx反向代理将对特定端口(如8080)的访问重定向至内部的80端口,如下:

server {
        listen 8080 default_server;
        listen 8443 default_server ssl http2;

        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_redirect off;
                proxy_pass https://127.0.0.1:443;
        }
        error_page 497 https://$host:8443$request_uri;
}

然而部分网页会在跳转的时候丢失端口号8080,转而直接访问80端口。80端口当然是无法访问的,这就会出现问题。这时候需要这么修改:

        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_redirect https://$host https://$host:$server_port;
                proxy_pass https://127.0.0.1:443;
        }

proxy_redirect语句的作用是将返回的数据从https://$host改为https://$host:$server_port。

部分情况下需要动态修改静态页面上的导航链接,可以在页面上加入以下代码(via:sf)

<script>
  if(location.port != "")
  $(document).on('click', 'a:not([data-bypass])', function(e) {
	var $target = $(e.target),
		href = $target.attr('href');

	if (/^(http(s)?:)?\/\/.*\这里写你的根域名/.test(href)) {
		$target.attr('href', href+":"+location.port);
	}

	// 把检查过的 <a> 标记一下,以后就不会再次做检查
	$target.attr('data-bypass', 'bypass');
  });
<script>

发表评论

电子邮件地址不会被公开。 必填项已用*标注