【问题标题】:How does StackOverflow avoid file extentions and GET parameters in its URLs?StackOverflow 如何避免其 URL 中的文件扩展名和 GET 参数?
【发布时间】:2012-02-07 07:58:07
【问题描述】:

这总是让我感到困惑。当您询问有关堆栈溢出的问题时,url 没有任何 get 语句。它也没有像 .cgi 或 .php 这样的扩展名。

然而,它不是一个静态的 html 页面,它是由数据库驱动的,因为它会在您发布答案或问题时发生变化。

这是否与他们的 .htaccess 配置有关。怎样才能达到类似的效果。

使用 php 或其他语言如何在不手动执行的情况下创建动态可编辑 php,例如通过类似于我提交此问题的方式的表单。

【问题讨论】:

标签: url dynamic


【解决方案1】:

Pretty/Clean/Fancy URLs

本质上,Web 服务器知道 URL 的片段实际上是 GET 参数,它会在将 URL 交给 PHP/Ruby/.NET/etc 之前“重写” URL。

例如,Apache 使用mod_rewrite 模块来完成此行为。

【讨论】:

    【解决方案2】:

    虽然 不能代表 Stackoverflow,但我知道一种常见的方法是使用 mod_rewrite 将漂亮的 url 转换为带有“GET”参数的 URL。许多解决方案都封装了 mod_rewrite,其他方式包括 [non-apache] Web 服务器。

    这个cheetsheet也很有帮助。

    【讨论】:

      【解决方案3】:

      这些称为Clean URLs,也称为漂亮或友好的网址:

      干净的 URL、RESTful URL 或用户友好的 URL 是纯粹的结构性 URL 不包含查询字符串而仅包含 资源的路径(在方案 [例如 http] 和权限之后 [例如。 example.org])。这通常是为了美观、可用性或 搜索引擎优化 (SEO) 目的。其他设计原因 网站或 Web 服务的干净 URL 结构包括确保 个别资源多年来一直在同一个 URL 下,这 使万维网成为一个更稳定和有用的系统,并使 它们令人难忘、合乎逻辑、易于打字、以人为本且寿命长。

      每个网络服务器都有自己的方法来管理干净的 URL。 Apache 使用来自 .htaccess 文件的 mod_rewrite 读取规则。 Stack Overflow 上有很多关于人们如何使用它的示例:

      https://stackoverflow.com/search?q=htaccess+rewrite

      对于大多数网络服务器,您管理一组关于如何重写 URL 以获取触发命名脚本的请求的规则。例如,您可能请求/questions/8811192/question-title,但服务器将其重写为/mywebsite.php?id=8811192&convention=questions,然后您的脚本 mywebsite.php 使用参数 id 和约定集运行,因此您的脚本知道用户最初请求的内容。然后它会查询数据库并动态创建页面。

      有关干净 URL 的更多信息,请参阅您的 Web 服务器文档。

      【讨论】:

        【解决方案4】:

        Mod_rewrite 就是一个例子。可以使用我在您的应用程序中隐藏 .php 扩展名。

        或者,如果您正在使用任何应用程序平台,例如任何 java 东西或 django 或烧瓶用于 python 或 ruby​​ on rails 或 rake 用于 ruby​​ 等等等。

        它关于 Web 服务器如何处理将请求代理到您用来处理交互性的应用程序层。从mod_php插件到fast_cgi再到wsgi等

        【讨论】:

          【解决方案5】:

          一些框架默认就是这样做的。

          例如,看看 Yii 或 Zend Framework,它们会让你达到那个效果。

          他们通常会使用网络服务器来帮助实现这一目标。

          【讨论】:

            【解决方案6】:

            网址路径不必绑定到文件系统上的任何物理位置。

            您可以在 Web 应用程序中解析 url 并执行映射到特定 url 模式的代码。将其视为一个内部的、应用程序内的 mod_rewrite。大多数现代 Web 框架都有某种基于 url 的调度程序。

            但是,如果您使用 cgi 脚本或类似 cgi 的应用程序执行(例如 php-cgi,它实际上是一个快速 cgi 协议服务器),您将不得不使用提到的 mod_rewrite 或一些类似的解决方案,具体取决于在您正在使用的网络服务器上。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-26
              • 1970-01-01
              • 1970-01-01
              • 2015-07-10
              • 2020-06-24
              • 2010-12-25
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多