【问题标题】:URL Rewriting In PHP MVC FrameworkPHP MVC 框架中的 URL 重写
【发布时间】:2010-12-15 21:05:23
【问题描述】:

我已经制作了自己的自定义 php 框架,它实现了 MVC 设计模式。 在其中,所有的 URL 都是这样构造的

mysite.com/index.php?route=controller/function/parameters/go/here mysite.com/index.php?route=products/shirts/99

我已设置 htaccess 以从 URL 中删除 index.php?route= 部分以制作它们 更多 SEF 使它们看起来像这样:

mysite.com/controller/function/parameters/go/here mysite.com/products/shirts/99

我只想在每个 URL 的末尾附加一个后缀,如下所示:

mysite.com/controller/function/parameters/go/here.html mysite.com/products/shirts/99.html

可能 htaccess 可用于实现这一目标或可能 其他一些解决方案。

有什么想法吗?

提前致谢。

【问题讨论】:

  • 我不明白你为什么要在不是纯 HTML 的页面上添加 .html 后缀。这对 SEO 或用户没有任何好处 - 实际上它可能会使情况变得更糟,因为它是不必要的。
  • 你是对的,但有些用户要求我将此功能添加到框架中,这就是我正在寻找解决方案的原因。
  • 如果您询问如何将 .html 附加到您的框架正在生成的链接(而不是解析链接的 mod_rewrite 规则),那么在不了解框架的情况下没有真正的方法可以回答它.

标签: php apache model-view-controller url


【解决方案1】:

我假设您正在使用“不错”的 url,然后将它们重写到您的 index.php,并将请求重写为 get var 或“路由”。

您将来会遇到一些问题,一个是如何处理请求中的 get vars(如果我记得几年前处理过类似的概念)。

就个人而言,我只是设置您的 .htaccess 以将所有无效文件/目录的请求发送到您的 bootstrap/index.php 文件。然后在 PHP 中进行解析,而不是在过于复杂的 mod_rewrite 中。 您已经在解析“路由”get var,为什么不直接解析整个请求?

此时 index.php 文件的第一步是:

  • 删除 .扩展名(或将请求标识为 html/xml/json/etc)
  • 删除任何类型的基本 URL。
  • 像解析 route get var 一样解析余数。

【讨论】:

    【解决方案2】:

    如果我理解正确,您说您已使用 htaccess 删除 route= 并且您还想删除 .html 后缀。我认为您以错误的方式接近它。

    我会让你的应用程序中的所有链接都指向你的首选 URL,然后在 route= 和 index.php 元素中添加 htaccess PUT IN

    所以链接看起来像这样:

    <a href="mysite.com/controller/function/parameters/go/here.html" />
    

    您可以使用类似于 Nicky 的 ton 的 htaccess 规则将其转换为:

    mysite.com/index.php?route=controller/function/parameters/go/here.html
    

    事实上,Nicky's 可以正常工作。您可以选择删除 index.php 代码或 htaccess 规则中的 .html 后缀 - 我认为 PHP 更容易。

    如果您想使用 htaccess 删除 .html,那么这可能会起作用(未经测试):

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)\.html$ index.php?route=$1 [QSA,L]
    </IfModule>
    

    【讨论】:

    【解决方案3】:

    与其他人一样,我认为附加需要在您的框架中进行。

    我想你有这样的功能: $html->link('products/shirts/99');

    该函数应添加“.html”。

    您的 url 处理程序应如下所示:

    //$查询 products/shirts/99.html

    $l = 爆炸 ($query, '/'); $last = 长度($l); $l[$last-1] = substring($l[$last-1] , find($l[$last-1] ,'.html')) //我正在从内存中做参数所以请检查它们.

    这就是 CakePHP 的 index.php 的修改方式。我建议您将该代码作为指南。

    【讨论】:

    • 哟,大卫,我终于想出了那个解决方案:)感谢所有回复的人......
    【解决方案4】:

    我不是专家,但试试这个:

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]
    </IfModule>
    

    【讨论】:

    • 感谢您的回答 Nicky,但我在上面的代码中没有看到 html 后缀。反正我还没试过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2012-06-30
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2016-04-04
    • 2014-02-07
    相关资源
    最近更新 更多