Regex htaccess正则表达式以匹配HTTP_主机的所有部分

Regex htaccess正则表达式以匹配HTTP_主机的所有部分,regex,.htaccess,mod-rewrite,Regex,.htaccess,Mod Rewrite,如果你想阅读我的问题而不需要解释,请跳到下面粗体的大标题 好了,伙计们,开始吧。首先,我的代码: AddType text/x-server-parsed-html .html .htm RewriteEngine On RewriteBase / # checking to see if it's a secure request, then set environment var "secure" to either "s" or "" # RewriteCond %{SER

如果你想阅读我的问题而不需要解释,请跳到下面粗体的大标题

好了,伙计们,开始吧。首先,我的代码:

AddType text/x-server-parsed-html .html .htm

RewriteEngine On
RewriteBase /

# checking to see if it's a secure request, then set environment var "secure" to either       "s" or ""
#
RewriteCond %{SERVER_PORT}s ^(443(s)|[0-9]+s)$ [NC]
RewriteRule ^(.+)$ - [env=secure:%2] [NC]



# Gets the value of the subdomain and puts it into environment variable "sub"
#
RewriteCond %{HTTP_HOST} ^([^\.]*)(\.)?example.com [NC]
RewriteRule ^(.*)$ - [env=sub:%1] [NC]



# Determines if the sub domain is blank, w, or ww, then redirects w/301 to www...
#
RewriteCond %{ENV:sub} ^(w|ww|)$
RewriteRule ^(.*)$ http%{ENV:secure}://www.example.com/$1 [R=301,L]



# Gets the highest sub domain and adds it as a top subdirectory to each request
#
RewriteCond %{REQUEST_URI}:example/%{ENV:sub} !^/([^/]+)[^:]*:\1 [NC]
RewriteRule ^(.*)$ /example/%{ENV:sub}/$1 [L]


#ErrorDocument 404 /pagenotfound
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1&%{QUERY_STRING} [PT]
所以,一切都完全按照它所期望的那样工作,除了我必须显式地设置域之外,我无法找出正则表达式来获得它,因此它将在不同的域中工作。下面是它的工作原理:

它首先确定请求是否安全,并将其保存以备将来使用

接下来,它对example.com的请求执行301重定向,该请求将“w”、“ww”或“”作为www.example.com的子域,从而强制该站点的所有请求使用www.example.com,除非您指定的子域不是(w | ww | www),例如“test”或“dev”或其他设置

接下来,它获取子域的值(它将始终存在,因为您要么请求了类似“dev.example.com”的内容,要么已重定向到“www.example.com”),然后将请求重写(而不是重定向)到下两级的子目录。设置时,这将是根目录中“example”下的“www”目录

最后,它将URI重写(而不是重定向)为美观,没有问题,我喜欢它的工作方式

目录结构如下:在根目录中,这里托管的每个站点都有一个目录(例如,anothersite,thirdsite)。就本htaccess文件而言,它们完全不相关。在每个目录中,至少有两个目录,“www”和“dev”。生产站点文件位于“www”中,开发文件位于“dev”中。你也可以在这里有一个测试环境的“test”目录,或者你想要的任何东西,这就是我设置它的方式

所以,我想要的是: 我知道这第二行是正确的,它只是第一行的正则表达式,我搞不懂。请记住,可能有指定的子域,也可能没有指定的子域,并且在该域之前可能有或可能没有一段时间

这将允许整个脚本处理根目录中托管的任何站点,如下所述,允许我重写第23行:

RewriteRule ^(.*)$ http%{ENV:secure}://www.%{ENV:domain}.%{ENV:tld}/$1 [R=301,L]
第29行是这样的:

RewriteCond %{REQUEST_URI}:%{ENV:domain}/%{ENV:sub} !^/([^/]+)[^:]*:\1 [NC]
所以,我想我已经非常清楚地解释了我所拥有的,我正在努力做的,以及我希望达到的目标。有人能帮我处理15号线的正则表达式吗

我知道这第二行是正确的,它只是第一行的正则表达式,我搞不懂。请记住,可能有指定的子域,也可能没有指定的子域,并且在该域之前可能有或可能没有一段时间

您的正则表达式将如下所示:

Rewritecond %{HTTP_HOST} ^(([^\.]+)\.)?([^\.]+)\.([^\.]+)$ [NC]
RewriteRule ^(.*)$ - [env=sub:%2,env=domain:%3,env=tld:%4]

这也将更改规则行(您在“-”之后缺少一个空格,因为
%1
现在也会反向引用点。

当然!我知道这必须很简单,比如在比赛中加入句号。乔恩,你是个正则表达式巫师!非常感谢!哦,我看到了“-”后面缺少的空格,这是我输入它时的一个输入错误,所以,在我的实际文件中是正确的,但是谢谢你提到它!
Rewritecond %{HTTP_HOST} ^(([^\.]+)\.)?([^\.]+)\.([^\.]+)$ [NC]
RewriteRule ^(.*)$ - [env=sub:%2,env=domain:%3,env=tld:%4]