如果提供https,如何将流量重定向到实时网站?

如何解决如果提供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 功能。

安装后,请按照以下步骤操作:

  1. 安装并信任根证书 Help -> SSL Proxying -> Install Charles Root Certificate
  2. 启用地图远程功能 Tools -> Map Remote -> [x] Enable Map Remote
  3. Add 一个新规则,例如http://www.mywebsite.com -> http://localhost:8080

现在您可以进行测试了:

  1. 导航到 http://www.mywebsite.com(您应该会看到来自本地主机的结果,代理接管了)
  2. 导航到 https://www.mywebsite.com(您应该会看到来自远程服务器的结果)
地图远程 - 规则 地图远程 - 结果
Map Remote - Rule Map Remote - Results
,

正如上面有人说的,但用不同的词:我真的不明白为什么要访问具有基本相同地址(不同协议)的两个不同位置。但是伙计,我们有什么资格告诉你不要这样做呢?不要让任何事情或任何人阻止你! ??

但是,有时我们需要跳出固有思维模式,想出不同的方法来实现相同的结果。你为什么不去你的域名提供商那里设置这样的东西:

  1. 创建一个子域(检查您是否需要为您的域设置 A 记录),以便您可以拥有类似 https://local.example.com/ 的内容。
  2. 将新的子域转发到您的本地 IP 地址(也许您需要打开/转发路由器上的端口并安装 DDClient 或类似服务来捕获您的动态本地/公共 IP 并将其发送给您的域提供商)。立>
  3. 保留指向您网站的@/naked 记录。

无论何时访问:https://www.example.comhttp://www.example.com,您都会看到您的网站。 如果您访问 https://local.example.comhttp://local.example.com,您将访问本地计算机上的任何内容。

希望它有所帮助,或者至少为您提供解决方案的不同视角。

,

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

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

  2. 因此我们需要路由这些请求,以便 a) https 请求由同一台机器(公共服务器)上的 nginx 处理,并且 b) http 请求被转发到您的本地机器。 nginx 可以做 a) 当然,这是一个普通的配置,nginx 也可以做 b),作为反向代理。

  3. 现在的问题是如何将流量从公共服务器路由到您的本地机器,本地机器可能位于动态 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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res