我正在尝试做一个简单的重定向,转到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
的任何实例?我相信正则表达式有问题吗?
任何帮助将不胜感激。
答案 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也被^(.*)$
模式捕获(捕获了任何东西),这导致了如下循环:
www.example.com/foo
/quokka/inquiry/ask.php?user=foo
/quokka/inquiry/ask.php?user=quokka/inquiry/ask.php
/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
标志,以确保没有其他紧随其后的指令得到处理。