使用反向代理更改源中的 URL?

使用反向代理更改源中的 URL?

有时我们会在另一台服务器上复制实时站点以测试新功能。许多 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)

如果我的理解正确,请尝试此解决方案:

  1. 在主机文件 (ubuntu /etc/hosts) 中添加条目

    # <IP-Adress>  <Hostname>
    127.0.0.1   yourCMS.local
    
  2. 更改 /etc/apache2/sites-available/yoursite 中的 apache 站点配置文件并添加:

    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>
    
    ProxyPass / http://yourCMS.local
    ProxyPassReverse / http://yourCMS.local
    
  3. 重启 Apache

  4. 尝试一下

这不是经过测试的解决方案。这可能无法解决您的问题,因为您在浏览器中添加的 URL 与配置不同。我从未朝这个方向做过。

开放其他解决方案和评论。

相关内容