Nginx 如果提供https,如何将trafic重定向到live网站?

Nginx 如果提供https,如何将trafic重定向到live网站?,nginx,nginx-reverse-proxy,Nginx,Nginx Reverse Proxy,我的本地主机运行在http://localhost:8080。现在,我有一个这样的要求,每当我输入时,它应该加载我的本地主机,如果我输入,它应该加载实时网站 为了实现这一点,我尝试了hosts(/etc/hosts)文件和Nginx,但它也停止了在我的系统中加载实时网站 主机文件内容: 127.0.0.1 www.mywebsite.com nginx配置 server { listen 80; server_name www.mywebsite.com; location

我的本地主机运行在
http://localhost:8080
。现在,我有一个这样的要求,每当我输入时,它应该加载我的本地主机,如果我输入,它应该加载实时网站

为了实现这一点,我尝试了hosts(/etc/hosts)文件和Nginx,但它也停止了在我的系统中加载实时网站

主机文件内容:

127.0.0.1 www.mywebsite.com
nginx配置

server {
  listen    80;
  server_name  www.mywebsite.com;
  location / {
    proxy_pass http://127.0.0.1:8080;
  }
}
完全同意其他答案,从远程主机上的nginx映射到本地主机可能很困难,除非您知道本地机器的公共IP地址,理想情况下,它应该是静态的

备选方案

我鼓励您尝试一些可以安装在本地机器上的代理工具,即及其
Map Remote
功能

安装后,请执行以下步骤:

  • 安装并信任根证书
    帮助->SSL代理->安装根证书
  • 启用地图远程功能
    工具->地图远程->[x]启用地图远程
  • 添加新规则,例如
    http://www.mywebsite.com -> http://localhost:8080
  • 现在,您已经准备好测试:

  • 导航到(您应该看到本地主机的结果,代理已接管)
  • 导航到(您应该可以看到来自远程服务器的结果)
  • 地图遥控规则 地图远程-结果
    您可以通过将live站点上的HTTP连接重定向到localhost来实现这一点。首先删除主机文件中的记录。 然后将以下内容添加到live站点的nginx.conf中

    server {
      listen    80;
      server_name  www.mywebsite.com;
      location / {
        # change this to your development machine's IP
        if ($remote_addr = 1.2.3.4) {
          rewrite ^ http://127.0.0.1:8080;
        }
      }
    }
    

    正如上面有人说的,但用不同的话来说:我真的不明白为什么你想访问两个基本上相同地址(不同协议)的不同位置。但是伙计,我们是谁能告诉你不要这么做?不要让任何事情或任何人阻止你 您必须创建,或者它可能已经存在于您的nginx配置文件中,一个用于listen443(https)的部分


    无论你选择什么解决方案,它都应该只对你有效一次。如果您正确配置了live站点,则应该可以,下次键入“http://www.mywebsite.com“您的浏览器将获得”https://www.mywebsite.com“您的nginx甚至不会听到不安全的http请求

    但是,如果您真的非常想这样做,您可以让您的本地nginx代理https站点和HSTS头:

    server {
      listen    443;
      server_name  www.mywebsite.com;
      proxy_pass https://ip_of_live_server;
      proxy_set_header Host $host;
      [... strip 'Strict-Transport-Security' ...]
    }
    

    当然,您需要本地nginx为这些TLS会话提供浏览器信任的证书。要么在浏览器中添加一个自签名的Snake Oil,要么。。。因为我们在实施坏主意。。。将live密钥材料的副本添加到本地主机…;)

    你需要几件才能完成这项工作。思考如何处理请求的步骤:

  • www.mywebsite.com
    的DNS指向一个IP,这是无法绕过的。因此,对该主机的所有请求,无论采用何种协议,都将进入具有该IP的机器,即公共服务器

  • 所以我们需要路由这些请求,这样a)https请求由同一台机器(公共服务器)上的nginx处理,b)http请求被转发到本地机器。nginx可以做a)当然,这是正常配置,nginx也可以做b),作为反向代理

  • 现在的问题是如何将流量从公共服务器路由到本地机器,而本地机器可能位于动态IP和执行NAT的路由器后面。有一些服务可以做到这一点,但使用自己的域名通常是一种付费功能(例如签出,我想可能也能处理这个问题,不确定)。要自己做,可以使用反向SSH隧道

  • 明确地说,这将路由任何
    http://www.mywebsite.com/
    发送到本地计算机,而不仅仅是您自己的请求。每个访问该站点http版本的人最终都会访问您的本地计算机,至少在隧道打开时是这样

    对于1,您只需要正常设置DNS,为
    www.mywebsite.com
    创建一个DNS记录。您不需要任何
    /etc/hosts
    技巧,请删除这些技巧(或者重新启动,以确保它们不会被缓存并使事情复杂化)

    对于2,公共服务器上的nginx配置如下所示:

    # First the http server, which will route requests to your local machine
    server {
        listen 80;
        server_name www.mywebsite.com;
    
        location / {
            # Route all http requests to port 8080 on this same server (the
            # public server), which we will forward back to your localhost
            proxy_pass http://127.0.0.1:8080;
        }
    }
    
    # Now the https server, handled by this, public server
    server {
        listen 443 ssl;
        server_name www.mywebsite.com;
    
        # SSL config stuff ...
        # Normal nginx config ...
        root /var/www/html
        location / {
            # ... etc, your site config
        }
    }
    
    ssh user@www.mywebsite.com -nNT -R :8080:localhost:8080 &
    
    本地计算机上的nginx配置应该只是一个普通的http服务器,监听端口8080(您提到的运行它的端口)。没有代理,这里没什么特别的

    对于3),最后,我们需要打开一个从本地计算机到公共服务器的隧道。如果您在Linux或macOS上,可以通过以下命令行执行此操作:

    # First the http server, which will route requests to your local machine
    server {
        listen 80;
        server_name www.mywebsite.com;
    
        location / {
            # Route all http requests to port 8080 on this same server (the
            # public server), which we will forward back to your localhost
            proxy_pass http://127.0.0.1:8080;
        }
    }
    
    # Now the https server, handled by this, public server
    server {
        listen 443 ssl;
        server_name www.mywebsite.com;
    
        # SSL config stuff ...
        # Normal nginx config ...
        root /var/www/html
        location / {
            # ... etc, your site config
        }
    }
    
    ssh user@www.mywebsite.com -nNT -R :8080:localhost:8080 &
    
    如果你在Windows上,你可以使用PuTTY或Win10上的内置SSH客户端

    其中的重要部分是(从SSH手册页复制):

    -R
    部分指定到远程端口8080(其中nginx路由http请求)的连接应转发到本地主机端口8080(您的本地计算机)。当然,端口可以是任何类型的,例如,如果您想在公共服务器上使用端口5050,在本地计算机上使用端口80,那么它看起来就像
    -R:5050:localhost:80

    当然,如果您的公共IP地址(在本地主机端)发生变化,或者您重新启动,或者您的本地wifi出现故障,隧道将失败,等等


    注意:您还应该意识到,您确实正在向公共互联网开放您的本地计算机,因此将面临与公共互联网上任何服务器相同的安全风险,就像各种脚本探测漏洞等。每当我使用这样的反向隧道时,我倾向于只在开发时将其关闭,并在完成后立即将其关闭(当然,当隧道关闭时,站点将无法工作)。

    您的意图还不够清楚。。。最终目标是什么?你想完成什么?你期望得到什么样的结果?可以吗