.htaccess正则表达式差异/利弊

时间:2012-02-13 00:16:01

标签: regex apache .htaccess mod-rewrite

我的.htaccess中有一堆规则(子域名,文件夹,用户特定文件夹等...)

我正在使用这个正则表达式:

([a-z0-9A-Z])

我正在寻找一个特定的规则,我找到了多种方法来构建它,我很想知道 如果有这些标准做法?使用类似的东西有什么区别/利弊:

  • ([^.]+)
  • ([^/]+)
  • (.*)
  • ([a-z0-9]+)

1 个答案:

答案 0 :(得分:33)

假设我们有这个.htaccess:

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L]

您的问题中提到的表达式将具有以下逻辑:

<强> ^(。*)$

  • .:匹配任何字符和任何单个字符
  • *:匹配前一个符号的零个或多个

基本上它会匹配以下内容:

  • folder1/file1.html:$ folder1/file1.html
  • file1.html:$ 1将为file1.html

这样很容易用PHP或Python解析整个请求。另一方面,您不会过滤URL中必须在脚本中验证的任何不需要的字符。

示例: =@*-+

<强>([^。] +)

  • []:匹配方括号内的任何符号
  • [^]:匹配大括号内列出的字符以外的任何字符(ref)。
  • +:匹配上一个符号
  • 中的一个或多个
  • [^.]:匹配.个字符以外的任何内容。将在找到.字符时停止匹配

来自ref

  

字符类中唯一的特殊字符或元字符是右括号(]),反斜杠(),插入符号(^)和连字符( - )。通常的元字符是字符类中的普通字符,不需要通过反斜杠进行转义。要搜索星号或加号,请使用[+ *]。如果你逃避字符类中的常规元字符,你的正则表达式将正常工作,但这样做会大大降低可读性。

基本上它会匹配以下内容:

  • folder1/file1.html:$ folder1/file1
  • file1.html:$ 1将为file1

这与第一个效果相同,只是在第.

点之后剥离了所有内容

<强> ^([^ /] +)$

  • []:匹配方括号内的任何符号
  • +:匹配上一个符号
  • 中的一个或多个
  • ^:匹配字符串的开头
  • [^/]:匹配/个字符以外的任何内容。将在找到/字符时停止匹配

这与第一个效果相同,但这将检查/之前的任何请求。因此,如果您有多个文件夹,则必须多次包含此正则表达式。

基本上它会匹配任何类似的东西(如果你只有一套):

  • folder1/file1.html:$ folder1
  • file1.html:$ 1将为file1.html

如果你有2:

  • folder1/file1.html:1美元将folder1,$ 2将匹配file1.html
  • file1.html:$ 1将为file1.html

您拥有的文件夹越多,您可能需要添加的规则就越多。

^([a-z0-9] +)$ [ ^([a-z0-9。] +)$ 此示例]

  • []:匹配方括号内的任何符号
  • +:匹配上一个符号
  • 中的一个或多个
  • a-z:匹配来自a到z的字母
  • 0-9:匹配0-9
  • 中的数字

(您也可以使用\ d或\ w)

基本上它会匹配任何东西(如果你只有一组 - 添加了点):

  • folder1/file1.html:$ folder1
  • file1.html:$ 1将为file1.html

如果你有2:

  • folder1/file1.html:1美元将folder1,$ 2将匹配file1.html
  • file1.html:$ 1将为file1.html

除了你必须指定你想要的字符外,这个工作方式与之前的工作方式类似。因此,当您在PHP中检查字符串时,您会知道您获得了哪些字符。 就像在我的文件名示例中我必须添加\.所以它识别点。这个也更快执行。

参见基准:.htaccess mod_rewrite performance

所以,如果你知道你会得到什么类型的请求,你总是可以使用最后一个,但如果你不确定,你将不得不选择一个更适合你需要的那个。所有这些之间可能存在更多差异,但理解这些正则表达式的主要目标是了解它们的作用或捕捉。此外,您还需要考虑性能。匹配所有内容然后在PHP或Python中解析请求可能需要更长的时间,而不是简单地匹配它们,只需在脚本中使用它们。