RewriteRule 给我的正则表达式带来问题

RewriteRule giving me issues with my regex

我正在尝试做一个简单的重定向,转到 url 像 www.example.com/foo 将带我到 www.example.com/quokka/inquiry/ask.php?user=foo

出于测试目的,我从这个开始:

RewriteRule ^(m.*)$ /quokka/inquiry/ask.php?user=

这非常适合 foo 以字母 m 开头的用例,但我希望它是超级可定制的。然后我将其作为我的重定向(注意删除字母 m):

RewriteRule ^(.*)$ /quokka/inquiry/ask.php?user=

为什么上面的 RewriteRule 不适用于 foo 的任何实例?我认为我的正则表达式有问题?

如有任何帮助,我们将不胜感激。

RewriteRule ^(.*)$ /quokka/inquiry/ask.php?user=

根据您在 .htaccess 文件中的其他指令,这可能会导致内部重写循环,从而阻止 URL 正确解析(您是否获得 500 Internal服务器错误?)。或者,充其量是对 /quokka/inquiry/ask.php?user=quokka/inquiry/ask.php.

的无效重写

旁白: 请注意,如前所述,这是一个 内部重写 ,严格来说并不是你所说的 "redirect"在你的问题中。术语 "redirect" 通常是指 "external 3xx redirect"。 (尽管不可否认 Apache 文档也混淆了这些术语,但至少将其限定为 "internal redirect"。)

在上述指令的情况下,重写的 URL 也被 ^(.*)$ 模式捕获(捕获 anything),这导致一个类似这样的循环:

  1. 要求:www.example.com/foo
  2. 重写为:/quokka/inquiry/ask.php?user=foo
  3. 重写为:/quokka/inquiry/ask.php?user=quokka/inquiry/ask.php
  4. 重写为:/quokka/inquiry/ask.php?user=quokka/inquiry/ask.php
  5. :

URL-重写在到达.htaccess文件末尾时不会停止。处理循环直到 URL 不变地通过。 (虽然什么是 "change" 并不总是完全清楚,因为你可以简单地通过重写 URL 来获得循环,即使重写的 URL 是相同的,如步骤#4以上。)

模式 ^(m.*)$ "works" 因为重写的 URL 不以 "m" 开头。但是,如果您有其他以 "m" 开头的 URL,那么这些也会被重写并变得不可访问。

您需要有一个 unique URL,它只捕获 "user IDs"(在本例中)。例如,所有引用 "user IDs" 的 URL 都可以有一个特定的前缀,例如。 example.com/u/<userid>.

RewriteRule ^u/(.*)$ /quokka/inquiry/ask.php?user=

或者可能是不与任何其他 URL 冲突的最大长度(例如,在 3 到 8 个字符之间):

RewriteRule ^(.{3,8})$ /quokka/inquiry/ask.php?user=

此外,如果您尽可能限制用户 ID 的格式,那么这可能就足够了。例如。只有小写字母:

RewriteRule ^([a-z]+)$ /quokka/inquiry/ask.php?user=

但是,我更喜欢使用前缀和限制(正则表达式应始终尽可能 限制 ),因为它可以避免将来发生潜在的冲突。例如:

RewriteRule ^u/([a-z]{3,8})$ /quokka/inquiry/ask.php?user= [L]

此外,包括 L 标志以确保不会处理紧随其后的其他指令。