使用 apache ProxyPass 将新网站上的 URL 转发到旧 Web 服务器

使用 apache ProxyPass 将新网站上的 URL 转发到旧 Web 服务器

我们目前正在将网站迁移到 CMS,并在此过程中迁移到另一台服务器。旧服务器上有一些代码我们不想迁移到新服务器。我们希望 URL 保持不变,因此我们一直在研究(并且目前正在使用)ProxyPass。旧服务器实际上会这样做以将 URL 重新映射到公共和内部内容。旧服务器<Proxy>上的指令仍被注释掉,并且运行良好。

我尝试将以下内容放置在多个位置,虚拟主机指令内部、外部等等。启动 apache 时没有出现任何错误,但它从来没有起作用。

ProxyRequests On
Order allow,deny
Allow from all
ProxyVia On
ProxyPreserveHost On
ProxyPass /tester/ http://oldserver.companyname.com/app1/
ProxyPassReverse /tester/ http://oldserver.companyname.com/app1/

我已经尝试了几个例子,比这个更不宽容,更简单,等等。

Apache 似乎忽略了tester,并将其发送到 CMS,然后 CMS 返回 404。我们希望测试人员屏蔽旧的 URL,这正是我们目前在另一台机器上所做的。

这个特定的虚拟主机确实有一些重写规则,我也尝试过将它们放在前面或后面。模块在 httpd.conf 中较早加载。当前运行的是 apache 2.2。

截至目前 - 什么都没有发生。没有错误,没有日志(我看到的)等等。就好像规则实际上并不存在一样。

我确实注意到了一件事 - 它在我们的其他虚拟主机指令中运行良好。唯一的区别是另一个指令小得多,并且不包含一些针对 Wordpress 的重写规则。

这是我的 VirtualHost 的一个示例

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/html/wordpress
    ServerName wptest    
    ServerAlias wptest.site.com.local

    ErrorLog /var/log/httpd/wordpress-error-log
    CustomLog /var/log/httpd/wordpress-access-log common

    ProxyPass /tester http://www.company.com/app1

    RewriteEngine On   

    <IfModule mod_rewrite.c>
      #RewriteBase /wordpress/
      # Switched the logging on 2/15/13 JMD
      RewriteLog "/var/log/httpd/rewrite_log"
      RewriteLogLevel 4

    # From https://stackoverflow.com/questions/13235180/how-to-remove-trailing-slash-for-folder-index-html-when-index-html-is-stri

    # If it's a request to index(.html)
    RewriteCond %{THE_REQUEST} \ /(.+/)?index(\.html)?(\?.*)?\  [NC]
    # Remove it.
    RewriteRule ^(.+/)?index(\.html)?$ /%1 [R=301,L]    

     RewriteCond %{REQUEST_URI} \.html$
     RewriteRule ^(.*)\.html$ $1 [R=301,L]    

      RewriteRule ^/index\.php$ - [L]
      RewriteRule ^/css/(.*) /wp-content/themes/our2012/css/$1 [QSA,L]
      RewriteRule ^/js/(.*) /wp-content/themes/our2012/js/$1 [QSA,L]
      RewriteRule ^/img/(.*) /wp-content/themes/our2012/img/$1 [QSA,L]
      RewriteRule ^/font/(.*) /wp-content/themes/our2012/font/$1 [QSA,L]
      RewriteRule ^/plugins/(.*) /wp-content/plugins/$1 [QSA,L]
      RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
      RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
      RewriteRule . /index.php [L]    
   </IfModule>
</VirtualHost>

根据请求从 StackOverflow 交叉发布

答案1

如果您的 CMS 在 .htaccess 中使用 Mod 重写,则 domain.com/test 可能会在 proxypass 之前得到处理。

您可以考虑将带有 [p] 标志的重写规则与 WordPress 重写规则结合使用。

(未经测试的规则被匆忙地拼凑起来作为例子)

RewriteRule /test/$ http://oldserver.example.com/ [P]
ProxyPassReverse /test/ http://oldserver.example.com/

http://httpd.apache.org/docs/current/rewrite/flags.html#flag_p

另一个链接包含有关使用 mod_rewrite 代理的信息
http://httpd.apache.org/docs/2.2/rewrite/proxy.html

相关内容