查看与主机名关联的不同 IP 上的网站的简单方法是什么?

查看与主机名关联的不同 IP 上的网站的简单方法是什么?

一些背景知识 — WordPress 在访问主机名方面确实很烦人,这使得创建测试环境相当痛苦(也就是说,我可以创建一个子域用于暂存,y.x.com但 WordPress 会将数据库中的所有链接设置为来自那里,而不是x.com,只要我进行 DNS 切换,它们就会在那里)。为了解决这个问题,我在 /etc/hosts 文件中设置了一个别名,这样我就不必在 WP 的设置中不断更改域名。

换句话说:现在我有一个在 IPx和主机名上运行的实时站点x.com。我想让实时站点继续运行,并在 IP 上设置了一个临时机器y,通过主机名 进行访问x.com,使用前面提到的 中的条目/etc/hosts

我的问题:如何在不让客户编辑其 /etc/hosts 文件的情况下向客户展示登台机器?是否有在线服务可以设置 iframe 并将特定 IP 显示为特定主机名?

谢谢!

编辑:我不是在问如何设置我的 DNS 记录;它们目前很好用。我只需在地址栏中输入其 IP 即可浏览到暂存机,然后 WordPress 加载,一切都很顺利,除了所有链接都指向x.com,单击它们会将我带到实时/生产站点。我可以通过将条目放入本地计算机的hosts文件(即/etc/hosts)来纠正此问题,这会覆盖实时站点的公共 DNS 记录并向我显示暂存机。我本质上是想为我的客户轻松地做到这一点,也就是说,无需他编辑他的hosts文件。

答案1

将 x.com/staging 映射到另一台服务器

假设您正在 Apache 上运行,代理可能会起作用。在 Apache 中运行反向代理建议下面的方法可能有效,但我没有测试过:

ProxyPreserveHost on
ProxyPass /staging/ http://y.y.y.y/
ProxyHTMLURLMap http://y.y.y.y /staging

<Location /staging/>
    ProxyPassReverse /
    ProxyHTMLEnable On
    ProxyHTMLURLMap / /staging/
    # We need to peek into the HTML, so ensure we don't get gzip'd content:
    RequestHeader unset Accept-Encoding
</Location>

上面,虚拟文件​​夹/staging将所有来自http://x.com/staging/映射/到另一个 IP 地址。为了继续用作x.com主机,我添加了ProxyPreserveHost

所有这些都需要尾随斜杠;一些标准重写可以在需要时添加:

# Add trailing slash if omitted
RewriteRule ^staging$ /staging/ [R=302,L]

避免共享 cookie:使用专用域

但是,为了避免会话 cookie 出现非常严重的问题,我更喜欢专用域(最好不是 的某个子域x.com)。为此,请删除对staging上述内容的所有引用。并且为了仍然发送预期的域名,我假设可以添加一个额外的:

RequestHeader set Host x.com

当使用这种专用域时,Apache 也不必重写任何相对 URL,例如/some/page重写到/staging/some/page。但是,这可能意味着您不会注意到重写绝对 URL 的失败(尤其是在涉及 JavaScript 时)。例如,如果生产服务器上存在相同的 URL,并且浏览器直接获取该 URL,则重写http://x.com/some/page回 的http://client.mycompany.com/some/page失败可能不会被注意到。这可能是一个好处,或者当您仍然登录到生产服务器时可能是一场灾难,并且思考您正在更改暂存服务器上的内容……

使用 .htaccess

只是为了后代,我早先认为也可以在文件中使用类似以下内容.htaccess

# Does NOT work (for me). On the target server, this gets me:
#   HTTP_HOST = y.y.y.y            - from the proxy request? Expected x.com
#   HTTP_X_FORWARDED_HOST = x.com  - from Host
#   HTTP_X_MY_DUMMY = x.com        - from X-My-Dummy, as expected

RewriteEngine On
RequestHeader set Host x.com 
RequestHeader set X-My-Dummy x.com
RewriteRule ^(.*) http://y.y.y.y/$1 [L,P] 
ProxyPassReverse / http://y.y.y.y/

但是,ProxyPassReverse在 中似乎不允许.htaccess。一些基本测试似乎表明[P]代理也总是添加自己的Host标头,并将我的转换HostX-Forwarded-Host。这很可能与我用于一些快速测试的共享虚拟主机有关。但ProxyPreserveHost不能在 中使用.htaccess

参见 Apache 的mod_proxymod_headersmod_rewrite文档。

答案2

您不能将同一个主机名绑定到不同的 IP,您必须编辑 DNS 记录以将域指向暂存机器,或者您必须通过 hosts 文件进行本地主机解析更改。

您还可以通过 PHP 或网站运行的其他语言添加检查/条件变量,如果存在,则会在登台机器上打开您的网站http://examplesite.com/?staging=true

答案3

另一种方法是使用普通代理服务器(例如乌贼/etc/hosts) 以及在代理服务器上编辑的。

当您使用 HTTP 代理时,客户端的浏览器不会对 x.com 进行 DNS 查找,而是连接到代理服务器并告诉它连接到 x.com。由于您已将 x.com 重定向到代理服务器上的另一个 IP,因此您会从暂存服务器获得结果。

相关内容