我的.htaccess中有一堆规则(子域名,文件夹,用户特定文件夹等...)
我正在使用这个正则表达式:
([a-z0-9A-Z])
我正在寻找一个特定的规则,我找到了多种方法来构建它,我很想知道 如果有这些标准做法?使用类似的东西有什么区别/利弊:
([^.]+)
([^/]+)
(.*)
([a-z0-9]+)
答案 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中解析请求可能需要更长的时间,而不是简单地匹配它们,只需在脚本中使用它们。