htaccess mod_rewrite 子目录到子域

htaccess mod_rewrite 子目录到子域

我正在使用以下 RewriteRule 将通配符子域重定向到 /users 子目录中的相应文件夹:

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

我想通过 301 重定向到子域版本来防止直接访问用户文件夹,如下所示:

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

任何帮助将不胜感激!

答案1

由于您正在停止,RewriteRule如果有一个/users/作为主要路径,那么username.domain.com/users/username/sub1/sub2/也会让他们到达那里 - 可能不符合预期。

考虑将每个用户子域的现有配置更改为VirtualDocumentRoot通配符虚拟主机,而不是现有的配置,以减少复杂性并减少每个请求所需的正则表达式评估次数。

<VirtualHost *:80>
    ServerName usernames.domain.com
    ServerAlias *.domain.com
    VirtualDocumentRoot /dir/to/users/%1
</VirtualHost>

然后,为了防止/users/通过正常主机名访问目录结构,将其应用于主站点的配置:

RewriteRule ^/users/.*$ - [F]

如果您打算使用 mod_rewrite 保留对子域的现有处理,那么您需要将其扩展为按主机名进行过滤:

RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]   # I'm assuming?
RewriteRule ^/users/.*$ - [F]

相关内容