我正在使用以下 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]