将www.example.com/folderredirect到folder.example.com

我将mantis设置为www.example.com/mantis,现在我已经设置了我的httpd.conf,以便在mantis.example.com上访问它。 由于我有很多链接引用早期的链接,我需要将它们redirect到新的位置。

这就是我现在使用的httpd.conf的内容:

<VirtualHost MYSERVERIP:80> ServerAlias EXAMPLE.com DocumentRoot /var/www/html/beta ServerName EXAMPLE.com UseCanonicalName On <IfModule mod_rewrite.c> RewriteEngine On RewriteLogLevel 5 RewriteLog "/var/www/html/htaccess.log" RewriteRule ^/mantis/(.*) http://mantis.EXAMPLE.com/$1 [L,R=301] RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ... </IfModule> </VirtualHost> ... <VirtualHost MYSERVERIP:80> ServerAlias mantis.EXAMPLE.com DocumentRoot /var/www/html/mantis ServerName mantis.EXAMPLE.com UseCanonicalName On </VirtualHost> 

但是,访问http://www.example.com/mantis/view.php?id=17575会导致:

 http://guide.opendns.com/main?url=www.mantis.EXAMPLE.com%2Fview.php%3Fid%3D17575 

这表明:

 You tried to visit www.mantis.EXAMPLE.com, which is not loading. 

请注意www。 部分。 我不明白它从哪里来!

htaccess日志如下:

 MYCLIENTIP - - [27/May/2011:09:40:57 +0000] [EXAMPLE.com/sid#2b4fab862578][rid#2b4fabeec150/initial] (2) init rewrite engine with requested uri /mantis/view.php MYCLIENTIP - - [27/May/2011:09:40:57 +0000] [EXAMPLE.com/sid#2b4fab862578][rid#2b4fabeec150/initial] (3) applying pattern '^/mantis/(.*)' to uri '/mantis/view.php' MYCLIENTIP - - [27/May/2011:09:40:57 +0000] [EXAMPLE.com/sid#2b4fab862578][rid#2b4fabeec150/initial] (2) rewrite '/mantis/view.php' -> 'http://mantis.EXAMPLE.com/view.php' MYCLIENTIP - - [27/May/2011:09:40:57 +0000] [EXAMPLE.com/sid#2b4fab862578][rid#2b4fabeec150/initial] (2) explicitly forcing redirect with http://mantis.EXAMPLE.com/view.php MYCLIENTIP - - [27/May/2011:09:40:57 +0000] [EXAMPLE.com/sid#2b4fab862578][rid#2b4fabeec150/initial] (1) escaping http://mantis.EXAMPLE.com/view.php for redirect MYCLIENTIP - - [27/May/2011:09:40:57 +0000] [EXAMPLE.com/sid#2b4fab862578][rid#2b4fabeec150/initial] (1) redirect to http://mantis.EXAMPLE.com/view.php?id=17575 [REDIRECT/301] 

相关: httpd.conf的更改允许www.mysite.com和www.mysite.com/mantis和phpmyadmin?


编辑1

将httpd.conf更改为:

 RewriteLogLevel 5 RewriteLog "/var/www/html/htaccess.log" RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteRule ^/mantis/(.*) http://mantis.EXAMPLE.com/$1 [L,R=301] 

还没有运气。

日志文件如下所示:

 MYCLIENTIP - - [27/May/2011:10:41:12 +0000] [EXAMPLE.com/sid#2b4fab856518][rid#2b4fabf06640/initial] (2) init rewrite engine with requested uri /mantis/view.php MYCLIENTIP - - [27/May/2011:10:41:12 +0000] [EXAMPLE.com/sid#2b4fab856518][rid#2b4fabf06640/initial] (3) applying pattern '^' to uri '/mantis/view.php' MYCLIENTIP - - [27/May/2011:10:41:12 +0000] [EXAMPLE.com/sid#2b4fab856518][rid#2b4fabf06640/initial] (4) RewriteCond: input='www.EXAMPLE.com' pattern='!^www\.' => not-matched MYCLIENTIP - - [27/May/2011:10:41:12 +0000] [EXAMPLE.com/sid#2b4fab856518][rid#2b4fabf06640/initial] (3) applying pattern '^/mantis/(.*)' to uri '/mantis/view.php' MYCLIENTIP - - [27/May/2011:10:41:12 +0000] [EXAMPLE.com/sid#2b4fab856518][rid#2b4fabf06640/initial] (2) rewrite '/mantis/view.php' -> 'http://mantis.EXAMPLE.com/view.php' MYCLIENTIP - - [27/May/2011:10:41:12 +0000] [EXAMPLE.com/sid#2b4fab856518][rid#2b4fabf06640/initial] (2) explicitly forcing redirect with http://mantis.EXAMPLE.com/view.php MYCLIENTIP - - [27/May/2011:10:41:12 +0000] [EXAMPLE.com/sid#2b4fab856518][rid#2b4fabf06640/initial] (1) escaping http://mantis.EXAMPLE.com/view.php for redirect MYCLIENTIP - - [27/May/2011:10:41:12 +0000] [EXAMPLE.com/sid#2b4fab856518][rid#2b4fabf06640/initial] (1) redirect to http://mantis.EXAMPLE.com/view.php?id=17575 [REDIRECT/301] 

唉…算出来的罪魁祸首

/ mantis /。中有一个.htaccess正在搞砸了…… 🙁

 RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

刚刚删除它,现在一切正常工作!

你有NameVirtualHost MYSERVERIP指令吗? 如果不是的话,我很确定把这条线添加到顶部将会解决你的问题。 没有它,apache只会忽略主机头,并使用它根据IPfind的第一个匹配的虚拟主机,这就是为什么它从第一个虚拟主机rewriterule重新添加www。

那么,在这里检查这个块:

 RewriteRule ^/mantis/(.*) http://mantis.EXAMPLE.com/$1 [L,R=301] RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

第一行是正确的。

第二个获取HTTP_HOST,现在是mantis.EXAMPLE.com。

然后第四行将其重写为www.mantis.EXAMPLE.com

最简单的方法是将第一行移到第四行的下面。 就那么简单。

尝试这样的,更简单。

 <VirtualHost *:80> ServerAlias example.com Redirect /mantis http://mantis.example.com ... </VirtualHost> <VirtualHost *:80> ServerAlias mantis.example.com ... </VirtualHost>