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

Mag*_*gie 14 regex apache .htaccess mod-rewrite

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

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

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

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

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

Boo*_*eus 33

假设我们有这个.htaccess:

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

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

^(.*)$

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

基本上它会匹配以下任何东西:

  • folder1/file1.html:1美元会 folder1/file1.html
  • file1.html:$ 1将是 file1.html

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

例: =@*-+

([^.] +)

  • [] :匹配方括号内的任何符号
  • [^]:匹配大括号(ref)中列出的字符以外的任何字符.
  • + :匹配前一个符号中的一个或多个
  • [^.]:匹配除.角色以外的任何东西.在.找到角色时会停止匹配

来自参考.

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

基本上它会匹配以下任何东西:

  • folder1/file1.html:1美元会 folder1/file1
  • file1.html:$ 1将是 file1

这与第一个效果相同,除了这个点之后的所有内容 .

^([^ /] +)$

  • []:匹配方括号内的任何符号
  • +:匹配前一个符号中的一个或多个
  • ^:匹配字符串的开头
  • [^/]:匹配除/角色以外的任何东西.在/找到角色时会停止匹配

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

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

  • folder1/file1.html:1美元会 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:1美元会 folder1
  • file1.html:$ 1将是 file1.html

如果你有2:

  • folder1/file1.html:$ 1将folder1和$ 2匹配file1.html
  • file1.html:$ 1将是 file1.html

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

查看基准:.htaccess mod_rewrite性能

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