Apache 2.0 RewriteRule Regex中不可避免的时期

时间:2011-12-16 19:57:09

标签: regex apache mod-rewrite escaping

所以,我有以下RegEx ..

RewriteRule ^([-a-z0-9]*[A-Z\.]+.*)$ file.php?string=$1 [QSA]

我希望file.php触发的网址必须包含大写字母或句点,然后将网址发送到PHP脚本。

但是,我遇到的问题是此脚本会在任何网址上触发,因为期间未真正转义。

我尝试用反斜杠或两个反斜杠或三个反转来逃避这段时间......但是没有一个停止一般解释。

我做错了什么?

编辑:举个例子,

RewriteRule ^([-a-z0-9]*[A-Z\\.]+[-a-z0-9\/]*)$ file.php?string=$1 [QSA]

不起作用,但是

RewriteRule ^([-a-z0-9]*\\.+[-a-z0-9\/]*)$ file.php?string=$1 [QSA]

确实逃脱了它。

编辑2 :我要重定向的网址示例:

  • /some-page-goes-here.html
  • /继承人-剥夺/旧/页/

我没有:

  • /检测/一/二/
  • /an/actual-file.gif

编辑3:旧正则表达式是:

RewriteRule ^([-a-z0-9]*[A-Z\.]+[-a-z0-9\/]*)$ file.php?string=$1 [QSA]

但在撰写帖子时,我将问题的正则表达式更新为您在上面看到的内容。

2 个答案:

答案 0 :(得分:1)

尝试:

RewriteCond %{REQUEST_URI} [A-Z] [OR]
RewriteCond %{REQUEST_URI} \.html$
RewriteRule (.*) file.php?string=$1 [QSA]

使用mod_rewrite并且您要匹配多个网址时,最好使用RewriteCond过滤然后应用RewriteRule

答案 1 :(得分:1)

我不认为你的问题可能是你的想法:字符类中的句点应该是字面句,而不是“任何字符”。如果这真的 问题,不知何故,那么您可以将[A-Z\.]+更改为([A-Z]|\.)+;但我对此表示怀疑。有些事要尝试:

  • 如果你注释掉这条线怎么办?这是否成功禁用此重定向?如果没有,那么显然问题不在于这条线。 : - )
  • 如果您通过将QSA更改为QSA,R来实现真正的HTTP重定向,会发生什么?目标网址是否与您期望的一样?也许有一些意想不到的句号或大写字母? (警告:如果您在浏览器中尝试,这很可能会触发无限重定向循环;尝试通过端口-80 Telnet提交请求并查看实际的HTTP响应可能会更容易。)

此外,您的规则与您描述的方式不完全一致。例如,您的规则与a.b.c之类的网址不匹配,因为您只在单个“clump”中出现大写字母和/或点;如果它们被小写字母分隔,则不会发生匹配。这只是因为你不想让描述过于复杂吗?