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

时间:2018-09-29 05:48:10

标签: .htaccess redirect url-redirection

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

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

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

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

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

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

取决于您.htaccess文件中还有其他哪些指令,这可能会导致内部重写循环,从而阻止URL正确解析(您是否收到500 Internal Server Error?)。或者,充其量是对/quokka/inquiry/ask.php?user=quokka/inquiry/ask.php的无效重写。

另外:注意,如前所述,这是内部重写,而不是严格按照问题中的说明进行“重定向”。术语“重定向”通常是指“外部3xx重定向”。 (尽管坦白地说,Apache文档也混淆了这些术语,但至少可以将其视为“内部重定向”。)

在上述指令的情况下,重写的URL也被^(.*)$模式捕获(捕获了任何东西),这导致了如下循环:

  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

到达.htaccess文件末尾时,URL重写不会停止。处理循环直到URL不变。 (尽管所谓的“更改”并不总是很清楚,因为即使重写的URL相同,也可以通过重写URL来获得循环,就像上面的步骤4中一样。)

模式^(m.*)$之所以“有效”,是因为重写的URL并非以“ m”开头。但是,如果您还有其他以“ m”开头的URL,则这些URL也将被重写并变得不可访问。

您需要有一个唯一 URL,该URL仅捕获“用户ID”(在这种情况下)。例如,所有引用“用户ID”的URL都可以具有特定的前缀,例如。 example.com/u/<userid>

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

或者最大长度不与任何其他URL冲突(例如3到8个字符):

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

此外,如果您对用户ID的格式有严格的限制,那么这也足够了。例如。仅小写字母:

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

但是,我倾向于使用前缀和限制(正则表达式应始终尽可能为 restrictive ),因为这样可以避免将来出现潜在的冲突。例如:

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

还要添加L标志,以确保没有其他紧随其后的指令得到处理。