一些背景知识 — 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
标头,并将我的转换Host
为X-Forwarded-Host
。这很可能与我用于一些快速测试的共享虚拟主机有关。但ProxyPreserveHost
不能在 中使用.htaccess
。
参见 Apache 的mod_proxy,mod_headers和mod_rewrite文档。
答案2
您不能将同一个主机名绑定到不同的 IP,您必须编辑 DNS 记录以将域指向暂存机器,或者您必须通过 hosts 文件进行本地主机解析更改。
您还可以通过 PHP 或网站运行的其他语言添加检查/条件变量,如果存在,则会在登台机器上打开您的网站http://examplesite.com/?staging=true
答案3
另一种方法是使用普通代理服务器(例如乌贼/etc/hosts
) 以及在代理服务器上编辑的。
当您使用 HTTP 代理时,客户端的浏览器不会对 x.com 进行 DNS 查找,而是连接到代理服务器并告诉它连接到 x.com。由于您已将 x.com 重定向到代理服务器上的另一个 IP,因此您会从暂存服务器获得结果。