如何解决如果提供https,如何将流量重定向到实时网站?
我的本地主机在 http://localhost:8080
上运行。现在,我有这样的要求,每当我输入 http://www.mywebsite.com 时,它应该加载我的本地主机,如果我输入 https://www.mywebsite.com,它应该加载实时网站。
为了实现这一点,我尝试了主机(/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;
}
}
解决方法
完全同意其他答案,除非您知道本地计算机的公共 IP 地址,否则从远程主机上的 nginx 映射到本地主机可能很困难,理想情况下它应该是静态的。 >
替代方案
我鼓励您尝试一些可以安装在本地计算机上的代理工具,即 Charles Proxy 及其 Map Remote
功能。
安装后,请按照以下步骤操作:
- 安装并信任根证书
Help -> SSL Proxying -> Install Charles Root Certificate
- 启用地图远程功能
Tools -> Map Remote -> [x] Enable Map Remote
-
Add
一个新规则,例如http://www.mywebsite.com -> http://localhost:8080
现在您可以进行测试了:
- 导航到 http://www.mywebsite.com(您应该会看到来自本地主机的结果,代理接管了)
- 导航到 https://www.mywebsite.com(您应该会看到来自远程服务器的结果)
正如上面有人说的,但用不同的词:我真的不明白为什么要访问具有基本相同地址(不同协议)的两个不同位置。但是伙计,我们有什么资格告诉你不要这样做呢?不要让任何事情或任何人阻止你! ??
但是,有时我们需要跳出固有思维模式,想出不同的方法来实现相同的结果。你为什么不去你的域名提供商那里设置这样的东西:
- 创建一个子域(检查您是否需要为您的域设置 A 记录),以便您可以拥有类似 https://local.example.com/ 的内容。
- 将新的子域转发到您的本地 IP 地址(也许您需要打开/转发路由器上的端口并安装 DDClient 或类似服务来捕获您的动态本地/公共 IP 并将其发送给您的域提供商)。立>
- 保留指向您网站的@/naked 记录。
无论何时访问:https://www.example.com 或 http://www.example.com,您都会看到您的网站。 如果您访问 https://local.example.com 或 http://local.example.com,您将访问本地计算机上的任何内容。
希望它有所帮助,或者至少为您提供解决方案的不同视角。
,您需要几个部分才能完成这项工作。思考如何处理请求的步骤:
-
www.mywebsite.com
的 DNS 指向单个 IP,这是无法绕过的。因此,对该主机的所有请求,无论采用何种协议,都将进入具有该 IP 的机器,即公共服务器。 -
因此我们需要路由这些请求,以便 a) https 请求由同一台机器(公共服务器)上的 nginx 处理,并且 b) http 请求被转发到您的本地机器。 nginx 可以做 a) 当然,这是一个普通的配置,nginx 也可以做 b),作为反向代理。
-
现在的问题是如何将流量从公共服务器路由到您的本地机器,本地机器可能位于动态 IP 和执行 NAT 的路由器后面。有一些服务可以做到这一点,但使用您自己的域通常是一项付费功能(例如,查看 ngrok,我猜 Traefik 可能也会处理此问题,不确定)。要自己完成,您可以使用反向 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
}
}
您本地机器上的 nginx 配置应该只是一个普通的 http 服务器,它侦听端口 8080(您提到它正在运行的端口)。没有代理,这里没什么特别的。
对于 3),最后,我们需要打开从本地机器到公共服务器的隧道。如果您使用的是 Linux 或 macOS,则可以从命令行使用以下内容执行此操作:
ssh user@www.mywebsite.com -nNT -R :8080:localhost:8080 &
如果您使用的是 Windows,则可以在 Win 10 上使用 PuTTY 或内置 SSH 客户端之类的工具。
其中的重要部分是(复制自 SSH 联机帮助页):
-N Do not execute a remote command. This is useful for just forwarding ports.
-R Specifies that connections to the given TCP port or Unix socket on the remote
(server) host are to be forwarded to the local side.
-R
部分指定到远程端口 8080(nginx 路由 http 请求的地方)的连接应转发到 localhost 端口 8080(您的本地机器)。端口当然可以是任何东西,例如,如果您想在公共服务器上使用端口 5050,在本地计算机上使用端口 80,则它看起来像 -R :5050:localhost:80
。
当然,如果您的公共 IP 地址(在您的本地主机端)更改,或者如果您重新启动,或者您的本地 wifi 出现故障等,隧道将失败......
注意:您还应该意识到您确实将本地计算机开放给公共互联网,因此将面临公共互联网上的任何服务器面临的所有相同安全风险,比如各种探测漏洞的脚本等等。每当我使用这样的反向隧道时,我倾向于只在开发时让它们保持运行状态,并在完成后立即关闭它们(当然,当隧道关闭时,站点将无法工作)。>
,您可以通过将实时站点上的 HTTP 连接重定向到 localhost 来实现此目的。首先删除您在主机文件中的记录。 然后将以下内容添加到您的实时站点的 nginx.conf 中。
from rdkit import Chem
from rdkit.Chem.Draw import rdMolDraw2D
from IPython.display import SVG
smile_1 = 'C(C(N)=O)c(c)c'
smile_2 = 'o(cn)c(c)c'
m1 = Chem.MolFromSmiles(smile_1,sanitize=False)
Chem.SanitizeMol(m1,sanitizeOps=(Chem.SanitizeFlags.SANITIZE_ALL^Chem.SanitizeFlags.SANITIZE_KEKULIZE^Chem.SanitizeFlags.SANITIZE_SETAROMATICITY))
m2 = Chem.MolFromSmiles(smile_2,sanitize=False)
Chem.SanitizeMol(m2,sanitizeOps=(Chem.SanitizeFlags.SANITIZE_ALL^Chem.SanitizeFlags.SANITIZE_KEKULIZE^Chem.SanitizeFlags.SANITIZE_SETAROMATICITY))
mols = [m1,m2]
legends = ["smile_1","smile_2"]
molsPerRow=2
subImgSize=(200,200)
nRows = len(mols) // molsPerRow
if len(mols) % molsPerRow:
nRows += 1
fullSize = (molsPerRow * subImgSize[0],nRows * subImgSize[1])
d2d = rdMolDraw2D.MolDraw2DSVG(fullSize[0],fullSize[1],subImgSize[0],subImgSize[1])
d2d.drawOptions().prepareMolsBeforeDrawing=False
d2d.DrawMolecules(list(mols),legends=legends)
d2d.FinishDrawing()
SVG(d2d.GetDrawingText())
,
您必须创建或者它可能已经存在于您的 nginx 配置文件中,一个用于侦听 443 (https) 的部分。
// 443 is the default port for https
server {
listen 443;
....
}
,
无论您选择哪种解决方案,它都应该只对您有效一次。如果您正确配置了您的实时站点,它应该执行 HSTS,下次您键入“http://www.mywebsite.com”时,您的浏览器将获取“https://www.mywebsite.com”和您的 nginx 甚至不会听到不安全的 http 请求。
但如果你真的,真的想要这个,你可以让你的本地 nginx 代理 https 站点和 strip 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 会话提供服务。要么在您的浏览器中添加一个自签名的蛇油,要么...因为我们正在实施坏主意...将您的实时密钥材料的副本添加到您的本地主机...;)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。