为什么ModRewrite不按预期返回正则表达式?

时间:2015-12-08 02:09:30

标签: regex mod-rewrite

我正在为我的网站开发动态子域名,到目前为止,我提出的ReWrite代码是:

RewriteRule ^.+\:\/\/?([a-zA-Z0-9]+)\.{1}.+\.{1}.+\/?([a-zA-Z0-9]*)?\/?([a-zA-Z0-9]*)?\/?([a-zA-Z0-9]*)?$ /app.php?var1='$1'&var2='$2'&var3='$3'&var4='$4' 

当我在http://regexpal.com的正则表达式测试中测试时,这就是我得到的

我的模拟输入是:http://testuser.testdomain.com/test/this/out

我的回复是:app.php?var1='testuser'&var2=''&var3=''&var4=''

我期待的是:app.php?var1='testuser'&var2='test'&var3='this'&var4='out'

您可以在此处查看我正在使用的内容:RegExPal Tool RewriteRule

修改

我不太了解RewriteCond,到目前为止我有这个:

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-zA-Z0-9]+)?/?([a-zA-Z0-9]+)?/?([a-zA-Z0-9]+)?/?([a-zA-Z0-9]+)?$ app.php?content=$1&id=$2&selector=$3&action=$4
RewriteRule ^([a-zA-Z0-9]+)?/?([a-zA-Z0-9]+)?/?([a-zA-Z0-9]+)?/?([a-zA-Z0-9]+)?/?$ app.php?content=$1&id=$2&selector&$3&action=$4

RewriteCond %{REQUEST_URI} !-d

RewriteRule ^(.+://{1}){1}([a-zA-Z0-9]+).{1}([a-zA-Z0-9]+.{1}[a-zA-Z0-9]+/){1}([a-zA-Z0-9]*)?/?([a-zA-Z0-9]*)?/?([a-zA-Z0-9]*)?/?([a-zA-Z0-9]*)?$ $1$3app.php?&content=$4&id=$5&selector=$6&action=$7

第一个条件是,如果未设置子目录,则该子目录当前正在工作。 我正在处理的第二个条件,我不知道如何使用RewriteCond,我找不到能很好地解释它的文档。

1 个答案:

答案 0 :(得分:0)

您尝试在RewriteRule中匹配过多,test/this/out本身仅接收路径 %{HTTP_HOST},但不接收协议或主机。要从主机中捕获子域,您必须先将%1RewriteCond变量匹配到RewriteRule变量,然后匹配(:?([^.]+)\.)?中路径的各个部分。

注意,我使用表达式(:?)仅捕获点之前的部分作为子域。外部部分的\.可确保%1中未捕获点{1}}。

更新并重写为一条规则:

经过一些实验,我在一个非常复杂的表达式中研究了如何做到这一点。它使用相同的RewriteCond匹配模式将子域抓取到%1,但使用类似(?:([^/]+)(?:/|$))?

的表达式替换路径段

这打破了:

  • ^ RewriteRule收到的字符串的开头(路径)
  • (?:不要捕获整个结构的变量
  • ([^/]+)抓住所有内容到下一个/(但不包括它)
  • (?:不要捕捉接下来发生的事情......
  • /|$ ...可以是斜杠或字符串结尾$
  • )关闭斜杠或结束匹配组
  • )关闭整个结构的外部组
  • ?并使整个事情可选

上面的所有内容都与第一个路径段(示例test中的/test/this/out)相匹配。然后重复两次以捕获另外两个变量。

所有与RewriteCond条件和子域匹配一起,它看起来像;

RewriteCond %{REQUEST_FILENAME} !-d
# Added condition for negative match on existing files
RewriteCond %{REQUEST_FILENAME} !-f
# Case-insensitive host match captures the subdomain into %1
# Using [^.]+ to match everything up to the first dot
# using a non-capturing outer group so the dot isn't grabbed
RewriteCond %{HTTP_HOST} ^(?:([^.]+)\.)?test\.com [NC]
# Match each segment optionally into $1,$2,$3
RewriteRule ^(?:([^/]+)(?:/|$))?(?:([^/]+)(?:/|$))?(?:([^/]+)(?:/|$))? index.php?subdomain='%1'&var2='$1'&var3='$2'&var4='$3' [L]

如果您可能需要附加其他查询字符串参数,请将[QSA]标记添加到[L,QSA]中,并添加到每个参数的末尾。

Full documentation on RewriteCond ...

相关问题