将一个子域发送到子目录,将其他所有内容发送到参数文件

时间:2012-04-08 06:24:41

标签: apache mod-rewrite redirect

Hoo-boy我整天都在为这一天苦苦挣扎。

从子域重定向到子域名作为参数传入的子域名工作正常。

当一个特定的子域实际上是一个真正的文件夹(phpmyadmin)时,我似乎无法使其工作,至少不能使用前面提到的规则。

这是我的东西:

<VirtualHost *.domain.com:443>
ServerName *.domain.com
ServerAlias *.domain.com
DocumentRoot /home/domain/web
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.* [NC]
RewriteCond %{HTTP_HOST} ^(phpmyadmin)\.domain\.com
RewriteCond %{REQUEST_URI} !^phpmyadmin
RewriteRule ^(.*)$ /phpmyadmin [L]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com
RewriteRule ^\/script2$ /public/script2.php?param1=%1 [L]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com
RewriteRule ^(.*) /public/script1.php?param1=%1 [L]
<Directory /home/domain/web>
Options -Indexes IncludesNOEXEC FollowSymLinks -MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
SSLEngine on
SSLCertificateFile /home/domain/crt
SSLCertificateKeyFile /home/domain/key
</VirtualHost>

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

2个问题:

RewriteCond %{HTTP_HOST} !^www.* [NC]
RewriteCond %{HTTP_HOST} ^(phpmyadmin)\.domain\.com
RewriteCond %{REQUEST_URI} !^phpmyadmin
RewriteRule ^(.*)$ /phpmyadmin [L]
  1. 在目标重定向中,您不会更改域。只需使用/ phpmyadmin,您就不会指向 www.domain.com/phpmyadmin ,而是指向 phpmyadmin.domain.com/phpmyadmin ,这很可能导致无限重定向循环,因为它将保持匹配每个重定向的phpmyadmin子域。使用:

    RewriteRule ^(.*)$ http://www.domain.com/phpmyadmin [L]

  2. 与初始/未使用的RewriteRule不同,RewriteCond %{REQUEST_URI}确实需要这样的前导斜杠:

    RewriteCond %{REQUEST_URI} !^/phpmyadmin

  3. 未能这样做意味着它与定向/ phpmyadmin不匹配,导致另一个潜在的自匹配无限重定向循环。

    你也不需要

    RewriteCond %{HTTP_HOST} !^www. [NC]

    因为您的网址永远不会以www开头,也会以phpmyadmin开头。匹配

    RewriteCond %{HTTP_HOST} ^(phpmyadmin)\.domain\.com

    自动暗示NOT www匹配条件也是如此