匹配mod_rewrite中的“句号”

时间:2010-07-20 11:16:12

标签: .htaccess mod-rewrite

目前我只是在.htaccess文件中匹配数字,字母,短划线和下划线:

RewriteRule ^([A-Za-z0-9-_]+)/?$ index.php?folder=$1

我也希望匹配字符串中的句号。我不想用:

(.*)

我试过了:

([.A-Za-z0-9-_]+)
([\.A-Za-z0-9-_]+)
([\\.A-Za-z0-9-_]+)
([A-Za-z0-9-_\.]+)

其中任何一个似乎都无法工作......我怎样才能完全停止,以便匹配一个句号!

----------补充资料----------------

举个例子:

mydomain.com/groups/green/应该转到index.php?folder = green

此外,我还重写了这个上面的子域名(我认为这导致了并发症)......

anotherdomain.com应该映射到index.php?folder = anotherdomain.com

我已成功使用以下规则重写了子域:

# external group domain name
RewriteCond %{ENV:Rewrite-Done} !^Yes$
## exclude requests from myhost.com
RewriteCond %{HTTP_HOST} !^www\.myhost\.com
## allowed list of domain masking domains
RewriteCond %{HTTP_HOST} ^(anotherdomain.com|extra.domain.com|external.otherdomain.com)
RewriteRule (.*) /groups/%1/$1

我认为这就是复杂性所在。

----------------解决方案----------------------

尽管没有找到上述确切问题的解决方案,但我通过改变第一个重定向(映射外部域)来解决这个问题:

 RewriteRule (.*) /groups/%1/$1

为:

RewriteRule (.*) /groups/external/$1&external_domain=%1

第二次重写(在文件夹上)可以解释“外部域”变量而不是文件夹。

1 个答案:

答案 0 :(得分:1)

你的第一个选择是最简单的,也是正确的。方括号内.没有特殊含义,所以你要逐字包括它,不需要任何特殊的转义。

实际上0-9-_中的第二个短划线存在一个小问题。如果你想在方括号内使用破折号,你应该把它放在字符类的开头。否则它将具有定义字符范围的特殊含义:

([-.A-Za-z0-9_]+)

如果这不起作用,则RewriteRule会出现其他问题。例如,如果这是一个全局规则而不是每个目录(没有RewriteBase),那么URL将以斜杠/开头。