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),这导致一个类似这样的循环:
- 要求:
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 不变地通过。 (虽然什么是 "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
标志以确保不会处理紧随其后的其他指令。
我正在尝试做一个简单的重定向,转到 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),这导致一个类似这样的循环:
- 要求:
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 不变地通过。 (虽然什么是 "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
标志以确保不会处理紧随其后的其他指令。