首页 > 解决方案 > htaccess:通配符子域到所有域的同名子文件夹

问题描述

在我的 htaccess 中,我使用通配符将所有子域重定向到同名的子文件夹。但是我需要为我拥有的每个域添加这个。我想把这个压缩到自动为任何领域做。

我确实有这个用于删除 www。来自请求:

RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^(.*) http://%1/$1 [R,L]

我对子文件夹的通配符子域的规则是:

RewriteCond %{HTTP_HOST} ^((?!www\.)[^.]+)\.domain\.tld$
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/?
RewriteRule ^(.*)$ http://domain\.tld/%1/$1 [L,QSA]

注意 www 删除规则的工作方式,使用(.*)%1代替 tld.. 使用相同的行为是行不通的,因为子域/子文件夹正在使用相同的行为。

有什么办法可以做到这一点?通过不对每个域重复此操作,它将极大地减少我的 htaccess。

编辑:好的,所以你可以有多个捕获组/正则表达式,虽然我很困惑如何让它工作。

还从这个页面找到了这个更整洁的版本,它去掉了第二个条件,以及 www 部分,因为我无论如何都删除了 www,所以从我能看到的内容来看并不重要。

RewriteCond %{HTTP_HOST} ^(.*)\.domain\.tld
RewriteRule ^(.*)$ http://domain.tld/%1/$1 [L,NC,QSA]

编辑2:看起来我在这里有一个赢家。获取 www 删除条件并将其切换并了解您如何执行此操作的逻辑。

RewriteCond %{HTTP_HOST} ^([^.]+)\.(.*)
RewriteRule ^(.*) http://%2/%1/$1 [R,L]

编辑 3:这适用于除 1.. 一个 cz 域之外的每个域。它将域名切换为该死扩展的子文件夹,就像domain.cz任何子cz/domain域一样作为辅助子文件夹。老实说,我对此感到非常困惑。

标签: .htaccess

解决方案


啊,我明白发生了什么。[^.]匹配第一个点之前的任何内容,因此没有子,它会执行 tld,如果您有该 tld 的子,它会执行顶级域,然后是它的子,因此您最终以 /tld/sub 为这样我就看到了我的 cz 域。

我的主要域我指向了这个规则不存在的虚拟主机,我的别名域我已经指向了这个规则存在的虚拟主机,但是因为它们在这个规则之前被重定向到我的主要域..他们是没有被它抓住。

同时,我的 .cz 域我目前没有去任何地方,并且它指向与规则相同的虚拟主机,因此它被它抓住了。

我敢肯定,如果您想采用一种虚拟主机方法,我相信有人能够提出确保 tld 被忽略的正则表达式。但这只会增加复杂性,尤其是在有不同数量的扩展名(例如 .co.uk)的情况下和.com。而且,如果您只有一种虚拟主机方法,例如将域重定向到子文件夹站点..那么它们就不会被该正则表达式捕获,只要它高于此规则即可重定向您想要在 htaccess 底部的子程序。

所以它按预期工作,当我实际上按照我想要的方式设置我的域时,我到目前为止还没有为我的 cz 做这件事,哈哈。

所以这确实适用于这条规则。

RewriteCond %{HTTP_HOST} ^([^.]+)\.(.*)
RewriteRule ^(.*) http://%2/%1/$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;
}
########

这太他妈简单了!


推荐阅读