.htaccess通配符重定向修复

时间:2011-09-30 13:05:55

标签: .htaccess mod-rewrite

我使用以下代码将通配符子域(* .domain.com)重定向到/ users中的相应文件夹,并将直接请求重定向到/ users文件夹到子域版本:

保护对通配符域文件夹的直接访问:

RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]

处理通配符子域请求:

RewriteCond %{REQUEST_URI} !^/users/ [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
RewriteCond %1 !=www [NC]
RewriteRule ^(.*)$ /users/%1/$1 [L]

此代码运行良好,但有两个问题似乎无法解决。

  1. 以下情况似乎发生,因为请求URI上没有尾随斜杠:

    username.domain.com/sub1 => username.domain.com/users/username/sub1 username.domain.com/sub1/ => username.domain.com/sub1 /

  2. 仍然可以使用子域直接访问用户目录:

    username.domain.com/users/username/sub1 =>工作,不应该

  3. 我很茫然,如果有人有任何想法,我会非常感激。

    谢谢!

1 个答案:

答案 0 :(得分:0)

对于问题2,我认为您的第一个保护规则只需要重定向所有子域。它重定向www,但让username.domain.com按原样通过。

这会将任何直接访问请求重定向到用户路径。

RewriteCond %{HTTP_HOST} ^.+\.domain\.com$ [NC]
RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]

我认为通过查找以domain.com结尾的任何主机(它甚至不会处理子域,只是domain.com)可能会更简单一些(我没有测试过这个......)

RewriteCond %{HTTP_HOST} domain\.com$ [NC]
RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]

对于问题1,我也很难过,抱歉。它的行为类似于尾随斜线是规则失败,所以它按原样落空。但我希望它可以按照你的意愿去做:

username.domain.com/sub1/ => username.domain.com/users/username/sub1 /

也许尝试%{REQUEST_URI}标记,而不是尝试捕获.*。我没有看到差异,但也许它会有所帮助。

RewriteCond %{REQUEST_URI} !^/users/ [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
RewriteCond %1 !=www [NC]
RewriteRule .* /users/%1%{REQUEST_URI} [L]