htaccess:通配符子域到所有域的同名子文件夹
htaccess: Wildcard subdomain to subfolder of same name for all domains
在我的 htaccess 中,我将所有子域通配符重定向到同名的子文件夹。但是我需要为我拥有的每个域添加它。我希望将此压缩为对任何域自动执行。
我有这个可以删除 www。来自请求:
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^(.*) http://%1/ [R,L]
我对子文件夹的通配符子域的规则是:
RewriteCond %{HTTP_HOST} ^((?!www\.)[^.]+)\.domain\.tld$
RewriteCond %1::%{REQUEST_URI} !^(.*?):://?
RewriteRule ^(.*)$ http://domain\.tld/%1/ [L,QSA]
注意 www 删除规则的工作方式,使用相同的行为使用 (.*)
和 %1
代替 tld.. 不会起作用,因为正在使用相同的行为对于 subdomain/subfolder.
有什么办法可以做到这一点吗?通过不对每个域重复此操作,它会大大减少我的 htaccess。
编辑:
好的,所以你可以进行多次捕获 groups/regex,尽管我很困惑如何让它工作。
Also found from this page 这个更整洁的版本取消了第二个条件,以及 www 部分,因为我无论如何都删除了 www,所以从我所看到的来看并不重要。
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.tld
RewriteRule ^(.*)$ http://domain.tld/%1/ [L,NC,QSA]
编辑 2:看来我赢了。获取 www 删除条件并将其切换并了解如何执行此操作的逻辑。
RewriteCond %{HTTP_HOST} ^([^.]+)\.(.*)
RewriteRule ^(.*) http://%2/%1/ [R,L]
编辑 3:这适用于除 1.. cz 域之外的所有域。它将域名切换为该死的扩展名的子文件夹,如 domain.cz
到 cz/domain
以及任何子域作为二级子文件夹。老实说,我对此非常困惑。
啊,我明白是怎么回事了。 [^.]
匹配第一个点之前的任何内容,所以如果没有子,它会匹配 tld,如果你有该 tld 的子,它会匹配顶级域,然后是它的子域,所以你最终得到/tld/sub 就像我在 cz 域中看到的那样。
我的主域我已指向不存在此规则的虚拟主机,我的别名域已指向存在该规则的虚拟主机,但因为它们在此规则之前被重定向到我的主域..他们没有被它抓住。
与此同时,我的 .cz 域目前没有去任何地方,而是指向与规则相同的虚拟主机,因此它被它捕获了。
我敢肯定有人会想出正则表达式来确保忽略顶级域名,如果你想要一个单一的虚拟主机方法..但这只会增加复杂性,尤其是在有不同数量的扩展名的情况下比如 .co.uk 和 .com。而且,如果您只有一种虚拟主机方法,例如将域重定向到子文件夹站点.. 那么它们就不会被该正则表达式捕获,只要它高于此规则即可在 htaccess 底部重定向您想要的子。
所以它按预期工作,当我实际上按照我的预期方式设置我的域时,我只是到目前为止还没有为我的 cz 做过大声笑。
所以这条规则确实有效。
RewriteCond %{HTTP_HOST} ^([^.]+)\.(.*)
RewriteRule ^(.*) http://%2/%1/ [R,L]
有点更新,我正在切换到 Nginx,所以对于所有希望这样做的 Nginx 用户,您可以通过以下方式实现:
######## Wildcard * subdomain to subfolder of same name
server {
listen 80;
listen 443 ssl;
server_name ~^(?<sub>[^.]+)\.(?<domain>.*)$;
return 301 https://${domain}/${sub}$request_uri;
}
########
太简单了!
在我的 htaccess 中,我将所有子域通配符重定向到同名的子文件夹。但是我需要为我拥有的每个域添加它。我希望将此压缩为对任何域自动执行。
我有这个可以删除 www。来自请求:
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^(.*) http://%1/ [R,L]
我对子文件夹的通配符子域的规则是:
RewriteCond %{HTTP_HOST} ^((?!www\.)[^.]+)\.domain\.tld$
RewriteCond %1::%{REQUEST_URI} !^(.*?):://?
RewriteRule ^(.*)$ http://domain\.tld/%1/ [L,QSA]
注意 www 删除规则的工作方式,使用相同的行为使用 (.*)
和 %1
代替 tld.. 不会起作用,因为正在使用相同的行为对于 subdomain/subfolder.
有什么办法可以做到这一点吗?通过不对每个域重复此操作,它会大大减少我的 htaccess。
编辑: 好的,所以你可以进行多次捕获 groups/regex,尽管我很困惑如何让它工作。
Also found from this page 这个更整洁的版本取消了第二个条件,以及 www 部分,因为我无论如何都删除了 www,所以从我所看到的来看并不重要。
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.tld
RewriteRule ^(.*)$ http://domain.tld/%1/ [L,NC,QSA]
编辑 2:看来我赢了。获取 www 删除条件并将其切换并了解如何执行此操作的逻辑。
RewriteCond %{HTTP_HOST} ^([^.]+)\.(.*)
RewriteRule ^(.*) http://%2/%1/ [R,L]
编辑 3:这适用于除 1.. cz 域之外的所有域。它将域名切换为该死的扩展名的子文件夹,如 domain.cz
到 cz/domain
以及任何子域作为二级子文件夹。老实说,我对此非常困惑。
啊,我明白是怎么回事了。 [^.]
匹配第一个点之前的任何内容,所以如果没有子,它会匹配 tld,如果你有该 tld 的子,它会匹配顶级域,然后是它的子域,所以你最终得到/tld/sub 就像我在 cz 域中看到的那样。
我的主域我已指向不存在此规则的虚拟主机,我的别名域已指向存在该规则的虚拟主机,但因为它们在此规则之前被重定向到我的主域..他们没有被它抓住。
与此同时,我的 .cz 域目前没有去任何地方,而是指向与规则相同的虚拟主机,因此它被它捕获了。
我敢肯定有人会想出正则表达式来确保忽略顶级域名,如果你想要一个单一的虚拟主机方法..但这只会增加复杂性,尤其是在有不同数量的扩展名的情况下比如 .co.uk 和 .com。而且,如果您只有一种虚拟主机方法,例如将域重定向到子文件夹站点.. 那么它们就不会被该正则表达式捕获,只要它高于此规则即可在 htaccess 底部重定向您想要的子。
所以它按预期工作,当我实际上按照我的预期方式设置我的域时,我只是到目前为止还没有为我的 cz 做过大声笑。
所以这条规则确实有效。
RewriteCond %{HTTP_HOST} ^([^.]+)\.(.*)
RewriteRule ^(.*) http://%2/%1/ [R,L]
有点更新,我正在切换到 Nginx,所以对于所有希望这样做的 Nginx 用户,您可以通过以下方式实现:
######## Wildcard * subdomain to subfolder of same name
server {
listen 80;
listen 443 ssl;
server_name ~^(?<sub>[^.]+)\.(?<domain>.*)$;
return 301 https://${domain}/${sub}$request_uri;
}
########
太简单了!