我们目前正在将网站迁移到 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>
答案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