代码之家  ›  专栏  ›  技术社区  ›  Mustafa

重写给我正则表达式问题的规则

  •  2
  • Mustafa  · 技术社区  · 6 年前

    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

    foo ? 我想我的正则表达式有问题吧?

    任何帮助都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  2
  •   DocRoot    6 年前
    RewriteRule ^(.*)$ /quokka/inquiry/ask.php?user=$1
    

    取决于你的工作中有什么其他指令 .htaccess 文件,这可能会导致一个内部重写循环,这会阻止URL正确解析(是否有500个内部服务器错误?)。或者,充其量是对 /quokka/inquiry/ask.php?user=quokka/inquiry/ask.php .

    请注意,如前所述,这是一个 ,而不是你在问题中所说的“重定向”。术语“重定向”通常指“外部3xx重定向”(尽管Apache文档也混淆了这些术语,但至少将其定义为“内部重定向”。)

    ^(.*)$ 模式(捕捉 任何东西 ),从而产生一个类似于:

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

    URL重写不会在到达文件结尾时停止 .htaccess访问 文件。处理循环,直到URL不变地通过(尽管被认为是“更改”的内容并不总是完全清楚,因为您只需重写URL即可获得循环,即使重写的URL相同,如上面的步骤4所示。)

    模式 ^(m.*)$

    你需要有一个 独特的 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
    

    尽可能)将是我的首选,因为它避免了潜在的冲突在未来。例如:

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

    另外,包括 L 标记以确保不处理紧跟其后的其他指令。