代码之家  ›  专栏  ›  技术社区  ›  Vladislav Rastrusny

php:解析不同风格的友好URL

  •  0
  • Vladislav Rastrusny  · 技术社区  · 15 年前

    我正在编写自己的小框架,我将在那里实现友好的URL。mod重写很好。但我希望能够同时处理几种类型的友好URL:

    /index.php?ac=user&an=showprofile (fallback variant, the worst)
    /index.php/user/showprofile (supposedly, can be disabled by security settings)
    index.php?user/showprofile (optional, not needed)
    /user/showprofile (ideal, but requires mod_rewrite or dirty ErrorDocument tricks)
    

    我希望同时支持所有的变体,这样用任何方案生成的旧链接都将永远有效。我应该为此编写自己的解析函数吗?或者,可能是,我错过了一些库/脚本,可以做到这一点吗?从大型框架(如symfony或zend)中提取算法非常困难。也有许多不同的不明显的情况,如correctl处理URL utf-8编码或使用magic_quotes_运行时等…

    3 回复  |  直到 15 年前
        1
  •  1
  •   Kris    15 年前

    如果您都能以编程方式区分所有不同类型的URL,并将它们规范化为一个基本形式,那么您只需编写一个简单的标记器函数来规范化不同的类型,并且您可以使用规范化的类型来获得实际的目的地。我已经做过了,但不是没有修改。当然,没有它也能做到。

    我通常有一个索引文件,它解析任何URL,然后进行一系列请求处理和路由以获得输出,而不直接将任何URL映射到任何文件。只需mod_将所有内容重写到该索引文件并分析 $_SERVER['REQUEST_URI'] .

        2
  •  0
  •   Ignacio Vazquez-Abrams    15 年前

    第一个到第三个应该传递给PHP进行处理( $_GET , $_SERVER["REQUEST_URI"] $_SERVER["QUERY_STRING"] )

    第四个可以用mod重写 RewriteCond !-f 一个合适的 RewriteRule .

        3
  •  0
  •   DisgruntledGoat    15 年前

    您应该避免允许所有不同类型的URL。如果您发布的所有URL都显示相同的内容,那么SES会将其视为重复的内容,并最终“拆分”您的排名。换句话说,四个页面中的每一个都将排名四分之一,如果一切都集中在一个URL上……如果这有意义的话。

    只需为用户选择一种简单的URL格式,并坚持使用它。 就我个人而言,我更喜欢最后一个, mod_rewrite .你的问题意味着使用 MODY重写 没有。

    你也可以使用像 $_SERVER["REQUEST_URI"] 为了检测请求的是什么URL,如果需要的话,执行301重定向到官方URL。