htaccess正则表达式匹配HTTP_HOST的所有部分

时间:2012-07-18 04:03:47

标签: 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 %{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”目录,这就是我如何设置它。

所以,我想要的是:

Rewritecond %{HTTP_HOST} ^(match sub domain).(match domain).(match TLD) [NC]
RewriteRule ^(.*)$ -[env=sub:%1,env=domain:%2,env=tld:%3] [NC]

我知道第二行的工作正常,它只是我无法弄清楚的第一行的正则表达式。请注意,可能会或可能不会指定子域名,并且域名之前可能有也可能没有。

这将允许整个脚本处理根目录中托管的任何站点,如下所述:允许我重写第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行的正则表达式吗?

1 个答案:

答案 0 :(得分:0)

  

我知道第二行的工作正常,它只是我无法弄清楚的第一行的正则表达式。请注意,可能会或可能不会指定子域名,并且域名之前可能有也可能没有。

你的正则表达式看起来像这样:

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

这也将改变规则行(你在“ - ”之后错过了一个空格),因为 %1 现在也反映了点。