【问题标题】:Question on dynamic URL parsing关于动态URL解析的问题
【发布时间】:2009-01-04 18:42:50
【问题描述】:

我看到很多很多网站都有单独页面的 URL,例如

http://www.mysite.com/articles/this-is-article-1 http://www.mysite.com/galleries/575

而且它们不会重定向,它们不会运行缓慢...

我知道如何解析 URL,这很容易。但在我看来,在动态网站上这似乎很慢而且很麻烦。同样,如果页面都是静态构建的(hende 自定义 URL),那么这意味着页面的所有组件也是静态的......(这会很糟糕)

我很想听听有关这通常是如何完成的一些想法。

【问题讨论】:

    标签: php url url-parsing


    【解决方案1】:

    您可以通过多种方式处理上述问题。一般来说,总是至少涉及某种形式的重定向——尽管这可能是在 .htaccess 级别而不是 php 级别。这是一个场景:

    1. 使用 .htaccess 重定向到您的 php 处理脚本。

    2. 解析 uri ($_SERVER['REQUEST_URI']) 并确定内容类型(例如,根据您的示例,文章或画廊)。

    3. 使用提供的 id(通常附加到 uri 的末尾,再次如您的示例中所示)来获取正确的数据 - 通过提供静态文件或查询数据库以获取请求的内容。

    这种方法是提高 SEO 的一种非常流行的方法,但正如您正确强调的那样,采用这种方法可能会遇到困难 - 通常不是性能,但它会使开发或管理更加麻烦(如果您的实施不好,则后者深思熟虑且可扩展)。

    【讨论】:

    • +1 用于解释,但您认为管理问题是什么?我为我的个人网站选择了这条路线,以减少管理员:所有页面都通过加载静态内容的单个模板运行
    • 我想我在使用这种方法时遇到的管理困难更多地与我在特定项目上继承的实现有关——我已经澄清了我在这一点上的答案。
    【解决方案2】:

    首先,当比较应用程序级别的 /plain/ URL 重写与使用 /plain/ CGI(CGI 可以是 PHP、ISAPI、ASP.NET 等)和服务静态页面时,服务静态文件总是会赢.工作量减少了。例如,在 Windows 和 Linux(据我所知)中,内核甚至增强了通过 HTTP 在本地驱动器上提供静态文件的功能。为了进一步说明这一点,我什至找到了一个使用多个服务器和操作系统的基准测试:http://www.litespeedtech.com/web-server-performance-comparison-litespeed-2.0-vs.html#RESULT 请注意,提供静态文件比使用任何类型的 CGI 都要快得多

    但是,有效地使用重写的 URL 可能会提高性能和可扩展性,并且它是通过缓存完成的。如果您返回正确的缓存标头(请参阅cache-control directive in HTTP documentation),那么它将使下游服务器能够缓存数据,因此您甚至不会在您的网站上获得点击。但是,我想您可以通过静态页面获得同样的好处 :) 我恰好在一两天前在 High Scalability 博客上读到了一篇关于这个主题的文章:http://highscalability.com/strategy-understanding-your-data-leads-best-scalability-solutions

    【讨论】:

      【解决方案3】:

      重写引擎是最好的方法,因为它们快速且经过优化。允许您的服务器端脚本仅使用普通的本地变量。

      Apache 的 mod_rewrite 是最常见的。

      【讨论】:

        【解决方案4】:

        它通常通过a rewrite engine 在服务器中(通过 Apache 中的 mod_rewrite 之类的东西)或在 Web 应用程序中完成(所有请求都被路由到 Web 应用程序,它为指定的路径寻找路由)。

        【讨论】:

          【解决方案5】:

          就我而言,我坚持使用已内置此功能的 Web 框架。 (CodeIgniter)

          ... 同样,如果页面都是静态的 构建(hende 自定义 URL)然后 意味着页面的所有组件都是 也是静态的......(这会很糟糕)

          ...是的,这确实很糟糕。 :o

          【讨论】:

            【解决方案6】:

            可以改写

            1. .htaccess 文件或 httpd.conf 或 vhosts.conf 文件中的服务器级别。这通常比在应用程序级别完成的下一级重写更快。

            2. 应用程序级别(在本例中使用 PHP)。您可以编写自定义重定向来分析 URL 并基于此以某种方式重定向。 Zend Framework (ZF) 等现代 Web 框架使用路由来控制 URL 重写。下面是一个带ZF的静态路由示例

            $route = new Zend_Controller_Router_Route_Static('latest/news/this/week', 数组('控制器' => '新闻'));

            这会将来自http://somedomain.com/lastest/news/this/week 的任何请求重定向到新闻控制器。

            动态路由的一个例子是

            $route = new Zend_Controller_Router_Route('galleries/:id', array('controller' => 'gallery'));

            变量 $id 可用于该控制器的位置(使用我们上面的示例将是 575)

            这些是非常有用的工具,可让您开发应用程序并回顾性地将 URL 更改为您想要的任何内容。

            【讨论】:

              【解决方案7】:

              一个非常简单的方法是让 CGI 解析 URL 的 PATH_INFO 部分。 在您的示例中:

              http://www.example.com/articles/12345 (where "articles" is a CGI script)
                                     ^CGI^   ^^^^^^PATH_INFO
              

              脚本名称之后的所有内容都在 PATH_INFO CGI 标头中传递给脚本。

              然后您可以进行数据库查找或任何您希望生成页面的操作。

              访问此值时要小心,因为 IIS 服务器和 Apache 服务器将 URL 的不同部分放在 PATH_INFO 中。 (IIRC:IIS 错误地使用了整个 URL,Apache 如上所述将其修剪掉。)

              【讨论】:

                【解决方案8】:

                在 apache 服务器上 mod_rewrite 是最常见的,它是一个 apache mod,它允许您使用正则表达式将请求 url 重写为其他 url,因此对于您的示例,将使用如下内容:

                重写引擎开启 RewriteRule ^articles/(.*)articles.php?article=$1 [L] RewriteRule ^galleries/(\d*) gallery.php?gallerie=$1 [L]

                这几乎不需要任何时间,实际上与拥有 url 一样快:
                www.mysite.com/galleries.php?gallerie=575 但看起来好多了

                【讨论】:

                  【解决方案9】:

                  我以前使用过这个方法——你只需要在正则表达式中添加不应该被重定向的文件扩展名,然后其他一切都由 php 处理,所以你不需要进入你的 .htacces 文件

                  suceed with urls

                  【讨论】:

                    猜你喜欢
                    • 2013-06-09
                    • 2019-02-27
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-10-12
                    • 1970-01-01
                    • 2011-10-03
                    • 2012-07-07
                    • 1970-01-01
                    相关资源
                    最近更新 更多