【问题标题】:.htaccess Wildcard Redirect Fix.htaccess 通配符重定向修复
【发布时间】:2011-10-13 10:59:39
【问题描述】:

我正在使用以下代码将通配符子域 (*.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 => 有效,但不应该

我很茫然,如果有人有任何想法,我将不胜感激。

谢谢!

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    对于问题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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2018-08-14
      • 1970-01-01
      相关资源
      最近更新 更多