【问题标题】:How was a URL like http://stackoverflow.com/posts/1807421/edit created in PHP?像 http://stackoverflow.com/posts/1807421/edit 这样的 URL 是如何在 PHP 中创建的?
【发布时间】:2010-12-20 22:38:48
【问题描述】:

当您在 stackoverflow.com 上编辑问题时,您将被重定向到如下 URL:

https://stackoverflow.com/posts/1807421/edit

但通常情况下,应该是

https://stackoverflow.com/posts/1807491/edit.php

https://stackoverflow.com/posts/edit.php?id=1807491

怎么样

https://stackoverflow.com/posts/1807421/edit 创建?

我知道 Stackoverflow.com 不是使用 PHP 创建的,但我想知道如何在 PHP 中实现这一点?

【问题讨论】:

标签: php url path filenames


【解决方案1】:

使用 mod_rewrite 这可以很容易地实现。

【讨论】:

  • 对于赞成票,您可能会花时间解释如何使用mod_rewrite 可以很容易地实现这一点。
【解决方案2】:

我在这方面很差,但我知道您可以使用 apache mod_rewrite 并通过触摸配置文件来重定向 url。据我所知,htaccess 可用于redirect。然后在内部当用户点击 http://stackoverflow.com/posts/1807421/edit 它可以使用你的页面 http://stackoverflow.com/edit.php?p=1807421 代替或任何你想要的。

【讨论】:

    【解决方案3】:

    您可以使用 htaccess + 编写一个 URI 解析器类。

    【讨论】:

      【解决方案4】:

      这叫做路由。看看tutorials的主题。

      如果您使用诸如cake php 之类的框架,则应该内置它。

      【讨论】:

        【解决方案5】:

        正如@mr-euro 所说,您可以使用 mod_rewrite 但前端控制器是一个更好的解决方案。 您将每个请求强制到 index.php,并在 index.php 中编写控制应用程序。

        【讨论】:

        • 嗯,这确实是一个有争议的问题,但对我来说,前端控制器是一个更好的解决方案,因为它可以处理 ajax、模板和页面生成,只是我的代码更少、结构统一和简单的 ajax 集成。
        【解决方案6】:

        对于 apache 和 PHP,您可以使用 apache 配置中的 mod_rewrite 规则执行您的示例之一,如下所示:

        RewriteEngine On
        RewriteRule ^/posts/(\d+)/edit /posts/edit.php?id=$1
        

        这会查找“干净”形式的 URL,然后重写它们,以便在内部将它们重定向到特定的 PHP 脚本。

        经常使用这样的规则将所有请求路由到一个公共控制器脚本中,该脚本可能会执行诸如实例化“PostsController”类并要求它处理编辑请求之类的事情。这是大多数 PHP 应用程序框架的共同特征。

        【讨论】:

          【解决方案7】:

          这确实是由 mod_rewrite 或多视图完成的。但我更喜欢 mod_rewrite。

          首先:您创建一个包含以下内容的 .htaccess 文件:

          RewriteEngine On
          RewriteRule ^posts/([0-9])/(edit|delete)$ /index.php?page=posts&postId=$1&action=$2
          

          很明显,mod_rewrite 必须由您的托管服务提供商启用;)

          【讨论】:

            【解决方案8】:

            您使用 Apache 的 .htaccess/mod_rewrite,以及可选的 PHP 文件,这是我自己喜欢采用的方法。

            对于 .htaccess,类似这样:

            RewriteEngine On
            RewriteRule ^(.*)$ index.php
            

            然后在你的 PHP 文件中,你可以这样做:

            下面应该得到第一个斜线之后的所有内容。

            $url = $_SERVER['REQUEST_URI'];
            

            然后你可以使用explode把它变成一个数组。

            $split = explode('/', $url);
            

            现在您可以使用数组来确定要加载的内容:

            if ($split[1] == 'home')
            {
            // display homepage
            }
            

            数组从 1 开始,因为 0 通常为空。

            【讨论】:

              猜你喜欢
              • 2015-04-07
              • 2012-03-03
              • 1970-01-01
              • 2010-11-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-17
              相关资源
              最近更新 更多