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的机器,即公共服务器
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出现故障,隧道将失败,等等
注意:您还应该意识到,您确实正在向公共互联网开放您的本地计算机,因此将面临与公共互联网上任何服务器相同的安全风险,就像各种脚本探测漏洞等。每当我使用这样的反向隧道时,我倾向于只在开发时将其关闭,并在完成后立即将其关闭(当然,当隧道关闭时,站点将无法工作)。您的意图还不够清楚。。。最终目标是什么?你想完成什么?你期望得到什么样的结果?可以吗