![使用反向代理更改源中的 URL?](https://linux22.com/image/628030/%E4%BD%BF%E7%94%A8%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E6%9B%B4%E6%94%B9%E6%BA%90%E4%B8%AD%E7%9A%84%20URL%EF%BC%9F.png)
有时我们会在另一台服务器上复制实时站点以测试新功能。许多 CMS 系统在数据库中对 URL 进行硬编码,因此无法直接使用另一个 URL。在我们的本地系统上,我们仅使用 hosts 文件将请求重定向到另一个 IP。这对我们的客户来说太复杂了,所以我们需要一种更简单的方法。可以使用 apache(我们使用 apache 作为 Web 服务器)作为反向代理,因此它会将 dev.somedomain.com 重定向到 anotherdomain.com。剩下的唯一问题是,HTML 源代码中有指向 anotherdomain.com 的绝对链接。有没有办法让 apache(或其他软件)将所有页面(+js +css)中指向 http(s)://anotherdomain.com 的所有链接替换为 http(s)://dev.somedomain.com?
性能不是问题,因为这显然永远不会在由多人使用的系统上运行。
答案1
Apache 确实有一个用于此的模块 - 它被称为mod_filter。
答案2
感谢 mod_filter 的提示。现在它似乎可以正常工作了!我遇到一个问题,即该网站同时使用带有 www 的 URL 和不带 www 的 URL。我的配置是:
<VirtualHost *:801>
ServerName www.dev.domain1.com
ServerAdmin [email protected]
SetEnvIf X-Forwarded-Proto https HTTPS=on
FilterProvider gzinflate INFLATE resp=Content-Encoding $gzip
FilterProvider replace SUBSTITUTE Content-Type $text/
FilterProvider gzdeflate DEFLATE Content-Type $text/
FilterChain +gzinflate +replace +gzdeflate
Substitute "s|domain2.com|dev.domain1.com|n"
ProxyPass / http://www.domain2.com/
ProxyPassReverse / http://www.domain2.com/
# ProxyHTMLEnable On
ProxyHTMLURLMap http://www.domain2.com/ /
ErrorLog /var/log/apache2/dev-proxy-error.log
LogLevel warn
CustomLog /var/log/apache2/dev-proxy-access.log combined
</VirtualHost>
对于不带 www 的域名
<VirtualHost *:801>
ServerName dev.domain1.com
ServerAdmin [email protected]
SetEnvIf X-Forwarded-Proto https HTTPS=on
FilterProvider gzinflate INFLATE resp=Content-Encoding $gzip
FilterProvider replace SUBSTITUTE Content-Type $text/
FilterProvider gzdeflate DEFLATE Content-Type $text/
FilterChain +gzinflate +replace +gzdeflate
Substitute "s|domain2.com|dev.domain1.com|n"
ProxyPass / http://domain2.com/
ProxyPassReverse / http://domain2.com/
# ProxyHTMLEnable On
ProxyHTMLURLMap http://domain2.com/ /
ErrorLog /var/log/apache2/dev-proxy-error.log
LogLevel warn
CustomLog /var/log/apache2/def-proxy-access.log combined
</VirtualHost>
仅使用 ProxyHTMLURLMap 是不够的,因为它只能替换完全相同的域名。带有 www 的域名不会替换不带 www 的域名,反之亦然。
我希望这对某些人有帮助。不过,对于这种广泛的过滤器,我强烈建议不要在生产站点上使用它!
答案3
我不太明白你到底想要什么,而且我的声誉太低,无法添加评论。
是的,你有这种情况:
yourCMS.local
|
|
+-----------> 创建系统副本 = dev.yourCMS.local
在您“复制的” Web 服务器中,您遇到以下情况:
用户在浏览器中添加“dev.yourCMS.local”,并且您的开发服务器将连接重定向到 URL yourCMS.local,但在同一台服务器上(查找 127.0.0.1)
如果我的理解正确,请尝试此解决方案:
在主机文件 (ubuntu /etc/hosts) 中添加条目
# <IP-Adress> <Hostname> 127.0.0.1 yourCMS.local
更改 /etc/apache2/sites-available/yoursite 中的 apache 站点配置文件并添加:
<Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://yourCMS.local ProxyPassReverse / http://yourCMS.local
重启 Apache
尝试一下
这不是经过测试的解决方案。这可能无法解决您的问题,因为您在浏览器中添加的 URL 与配置不同。我从未朝这个方向做过。
开放其他解决方案和评论。