无法使用Apache RewriteRule将请求从一台虚拟主机重定向到另一台虚拟主机

问题描述:

我有两台虚拟主机,由Apache Web服务器提供服务。一台主机用于PHP应用程序,另一台用于Django/Python应用程序。他们两个都很好,我没有问题。在这一刻我的httpd-vhosts.conf看起来像这样:无法使用Apache RewriteRule将请求从一台虚拟主机重定向到另一台虚拟主机

Listen 8080 
<VirtualHost *:8080> 
    DocumentRoot "c:/Apache24_32/htdocs/accent" 
    ServerName php.localhost 
    <Directory c:/Apache24_32/htdocs/accent> 
     Options Indexes FollowSymLinks 
     AllowOverride None 
     Order Deny,Allow 
     Allow from all 
    </Directory> 
    DirectoryIndex 
    <IfModule dir_module> 
     DirectoryIndex index.php index.html 
    </IfModule> 
</VirtualHost> 
<VirtualHost *:8080> 
    ServerName django.localhost 
    WSGIScriptAlias/"c:/Apache24_32/htdocs/django/accent/wsgi.py" 
    <Directory "c:/Apache24_32/htdocs/django/accent"> 
     Options +ExecCGI 
     Order allow,deny 
     Allow from all 
    </Directory> 
</VirtualHost> 

没关系。当我去php.localhost,我看到我的PHP应用程序,当我去django.localhost,我看到我的Django应用程序。尼斯。但我想要的是将请求从我的第一个PHP应用程序重定向到我的Django应用程序,以便每当URL中有/django/部分时,我将被重定向到django.localhost。例如,该URL

php.localhost:8080/django/ 

应该被映射到

django.localhost:8080 

这个网址

php.localhost:8080/django/test 

应该被映射到

django.localhost:8080/test 

我试图用重写规则,但无济于事。这是我的尝试:

Listen 8080 
<VirtualHost *:8080> 
    DocumentRoot "c:/Apache24_32/htdocs/accent" 
    ServerName php.localhost 
    <Directory c:/Apache24_32/htdocs/accent> 
     Options Indexes FollowSymLinks 
     AllowOverride None 
     Order Deny,Allow 
     Allow from all 
    </Directory> 
    DirectoryIndex 
    <IfModule dir_module> 
     DirectoryIndex index.php index.html 
    </IfModule> 
    #New lines 
    RewriteEngine on 
    RewriteRule "^django/(.*)$" "django.localhost:8080/$1" 
</VirtualHost> 
<VirtualHost *:8080> 
    ServerName django.localhost 
    WSGIScriptAlias/"c:/Apache24_32/htdocs/django/accent/wsgi.py" 
    <Directory "c:/Apache24_32/htdocs/django/accent"> 
     Options +ExecCGI 
     Order allow,deny 
     Allow from all 
    </Directory> 
</VirtualHost> 

正如你所看到的,我已经将这两行的第一虚拟主机描述:

RewriteEngine on 
RewriteRule "^django/(.*)$" "django.localhost:8080/$1" 

但是,这是行不通的。我像这样检查了它。在我的index.php页面我添加了一个参考:

<a href="/django">Go to Django!</a> 

但是,当我点击它,我重定向到http://php.localhost:8080/django,看到此错误消息:

未找到

请求在此服务器上找不到URL/django。

我不擅长配置Apache,希望有人能帮助我。非常感谢!

PS

我要补充,这行是在httpd.conf中取消注释:

LoadModule rewrite_module modules/mod_rewrite.so 

在虚拟主机方面,RewriteRule模式最初将针对URL后,部分匹配主机名和端口以及查询字符串之前,所以它在开始时有斜杠。这应该这样做:

RewriteRule ^/django/(.*)$ http://django.localhost:8080/$1" 
+0

我应该把它放在PHP虚拟主机定义? – Jacobian

+0

不幸的是,它不起作用。我仍然重定向到php.localhost:8080/django并得到相同的错误。 – Jacobian

+0

是的,你应该把它放在上面的.conf中,而不是你的RewriteRule。此外,这个规则不会只匹配'/ django'(没有结尾的斜杠),请尝试'Go to Django!' –