【问题标题】:Routing page requests with PHP the right way以正确的方式使用 PHP 路由页面请求
【发布时间】:2012-08-11 21:51:39
【问题描述】:

我需要知道“正确”执行网站导航的术语和最佳做法吗?方式,类似于当您通过 url 提问时 stackoverflow 如何路由您:

“http://stackoverflow.com/questions/ask”

根据我的 PHP 编程知识,我可能会这样编写代码:

“http://stackoverflow.com/index.php?p=questions&act=ask”

希望你明白我的意思。我想知道这种页面导航和请求/响应处理方法的术语,以及在使用这种标准/方法设计 Web 应用程序时我需要记住的最佳实践、限制或其他任何内容。我什至不知道这一切是否都是用 PHP 或一些用 ASP 或 Ruby 编码的 Web 后端完成的,或者你有什么,所以我用我的猜测填充了标签。

【问题讨论】:

  • 在php中一切皆有可能!我推荐使用 Zend、CakePHP、CodeIgniter 等框架!它们都提供了拥有漂亮 url 和 root 类的方法。
  • 漂亮的胡子,user1600933。
  • 通常 mod_rewerite 用于提供那种漂亮到丑陋的 url 东西。

标签: php apache mod-rewrite url-routing


【解决方案1】:

大多数 MVC 框架使用的模式是调用路由器的front controller。前端控制器通常是 Web 根目录中的 index.php。接下来,所有不针对现有文件(如 js、css 和图像资产)的请求都需要发送到此控制器。在 apache 中,您可以使用 mod_rewrite

RewriteRule ^index\.php$ - [F]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /index.php [L,QSA]

但是,Apache 2.5 中推荐的方式是使用FallbackResource

FallbackResource index.php

IIS has similar functionality 如果你正在使用它。

index.php 中,您可以访问最初使用$_SERVER['REQUEST_URI'] 请求的URL。您应该包括您的路由器(应该在 Web 根目录之外)并使用请求 URI 调用它。示例:

require '../router.php';

$router = new Router();
$router->process($_SERVER['HTTP_METHOD'], $_SERVER['REQUEST_URI'], $_GET, $_POST);

然后你的路由器可以找到合适的控制器来路由请求。阅读MVC framework 的更多信息,并研究some examples 以更好地了解其他人是如何实现它的。

【讨论】:

    【解决方案2】:

    他们很可能使用您在 URL 中描述的相同方法(嵌入导航变量),但它是在“幕后”完成的。

    允许您呈现此类 URL 的机制称为 MOD 重写。它使用 URL 中的变量和正则表达式的组合,以更加用户友好的方式向最终用户重新表示 URL。

    更多信息:http://httpd.apache.org/docs/current/mod/mod_rewrite.html

    编辑:当然这适用于在 apache 网络服务器上运行的代码。 IIS 等其他 Web 服务器可能也有类似的模块。

    另外,请注意 mod_rewrite 超出了 php 的范围。它实际上是 apache 服务器指令,在 php 发挥作用之前被调用。

    【讨论】:

    • 感谢您的回答,这正是我想要的。
    【解决方案3】:

    我目前正在开发一个针对超高性能的 php 路由器。你可能想看看:

    https://github.com/c9s/Pux

    Pux 在静态路由调度方面比 symfony 路由器快 48.5 倍,在正则表达式调度方面快 31 倍。 (安装了 pux 扩展)

    Pux 尽量不消耗计算时间来动态构建所有路由(如 Symfony/Routing)。相反,Pux 将你的路由编译成普通的 PHP 数组进行缓存,编译后的路由可以非常快速地从缓存中加载。

    借助 Pux PHP 扩展支持,您可以比纯 PHP Pux 快 1.5~2 倍地加载和调度路由。

    【讨论】:

    • 能否请您添加一个 pageNOtfound 的示例?
    猜你喜欢
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2019-12-27
    • 2019-04-07
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多