.htaccess 重写给我正则表达式问题的规则
我正在尝试做一个简单的重定向,在那里转到像.htaccess 重写给我正则表达式问题的规则,.htaccess,redirect,url-redirection,.htaccess,Redirect,Url Redirection,我正在尝试做一个简单的重定向,在那里转到像www.example.com/foo这样的url将带我到www.example.com/quokka/inquiry/ask.php?user=foo 出于测试目的,我从以下内容开始: RewriteRule^(m.*)$/quokka/inquiry/ask.php?user=$1 这对于foo以字母m开头的用例非常有用,但我希望它是超级可定制的。因此,我将此重定向(注意删除字母m): RewriteRule^(.*)$/quokka/inquiry
www.example.com/foo
这样的url将带我到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
为什么上面的重写规则不适用于foo
的任何实例?我相信我的正则表达式有问题
任何帮助都将不胜感激
根据.htaccess
文件中的其他指令,这可能会导致内部重写循环,从而导致URL无法正确解析(是否出现500内部服务器错误?)。或者,充其量是对/qookka/inquiry/ask.php?user=qookka/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
:
URL重写在到达.htaccess
文件末尾时不会停止。处理循环,直到URL不变地通过。(虽然被视为“更改”的内容并不总是完全清楚,因为您可以通过重写URL获得循环,即使重写的URL相同,如上面的第4步所述。)
模式^(m.*$
“有效”,因为重写的URL不是以“m”开头的。但是,如果您有一个以“m”开头的其他URL,那么这些URL也将被重写并变得不可访问
您需要有一个只捕获“用户ID”的唯一URL(在本例中)。例如,所有引用“用户ID”的URL都可以有特定的前缀,例如example.com/u/
或者可能具有与任何其他URL不冲突的最大长度(例如,在3到8个字符之间):
此外,如果您对用户ID的格式有尽可能多的限制,那么这也就足够了。例如,只有小写字母:
RewriteRule ^([a-z]+)$ /quokka/inquiry/ask.php?user=$1
然而,使用前缀和限制(regex应该总是尽可能地限制)将是我的首选,因为它可以避免将来潜在的冲突。例如:
RewriteRule ^u/([a-z]{3,8})$ /quokka/inquiry/ask.php?user=$1 [L]
另外,包括L
标志,以确保不会处理立即遵循的其他指令。非常感谢您的回答和指导。通过向重写规则添加以下内容,我可以解决我的错误:^/ask(.*)$
RewriteRule ^(.{3,8})$ /quokka/inquiry/ask.php?user=$1
RewriteRule ^([a-z]+)$ /quokka/inquiry/ask.php?user=$1
RewriteRule ^u/([a-z]{3,8})$ /quokka/inquiry/ask.php?user=$1 [L]