1

如果您想在没有解释的情况下阅读我的问题,请跳到下面的粗体标题。

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

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 重写(而不是重定向)漂亮,那里没问题,它按照我喜欢的方式工作。

目录结构如下:在根目录中,这里托管的每个站点(例如,另一个站点、第三站点)都有一个目录。对于这个 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 行的正则表达式吗?

4

1 回答 1

0

I know that line two of this works correctly, it's just the regex of line one I can't figure out. Keep in mind, there may or may not be a sub domain specified, and there may or may not be a period preceding the domain.

Your regex will look something like this:

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

Which will change the rule line as well (you were missing a space after the "-"), because %1 now backreferences the dot as well.

于 2012-07-18T16:08:17.080 回答