关于动态URL解析的问题

时间:2009-01-04 18:42:50

标签: php url url-parsing

我看到许多网站都有个别网页的网址,例如

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

他们没有重定向,他们不会慢慢运行......

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

我很想听听有关如何实现这一目标的一些想法。

9 个答案:

答案 0 :(得分:3)

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

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

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

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

  4. 这种方法是一种非常流行的增加搜索引擎优化的方法,但正如你正确地强调采用这种方法可能会遇到困难 - 通常不是性能,但它可能会使开发或管理更加麻烦(如果你的实施不是很好的话思考并可扩展)。

答案 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

答案 2 :(得分:1)

通常通过a rewrite engine在服务器(通过类似Apache中的mod_rewrite)或Web应用程序中完成(所有请求都路由到Web应用程序,后者查找指定路径的路径)

答案 3 :(得分:1)

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

Apaches mod_rewrite是最常见的。

答案 4 :(得分:0)

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

  

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

......是的,确实非常糟糕。 :○

答案 5 :(得分:0)

可以在

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

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

  3. 的静态路由示例

    $ route = new Zend_Controller_Router_Route_Static('latest / news / this / week', 数组('controller'=>'news'));

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

    动态路线的一个例子是

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

    变量$ id可用于该控制器(并使用上面的示例为575)

    这些非常有用的工具允许您开发应用程序并将URL追溯地更改为您想要的任何内容。

答案 6 :(得分:0)

一种非常简单的方法是让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如上所述修剪它。)

答案 7 :(得分:0)

在apache服务器上,mod_rewrite是最常用的,它是一个apache mod,它允许你用其他正确表达式的URL重写请求URL,所以对于你的例子,会使用这样的东西:

RewriteEngine ON
RewriteRule ^articles/(.*) articles.php?article=$1 [L]
RewriteRule ^galleries/(\d*) galleries.php?gallerie=$1 [L]

这几乎不花费任何时间,并且实际上和网址一样快:
www.mysite.com/galleries.php?gallerie=575但看起来更好

答案 8 :(得分:0)

我已经使用过这种方法 - 你只需要添加不应该在正则表达式中重定向的文件扩展名,然后其他所有内容都由php处理,这样你就不需要进入你的.htacces文件了

suceed with urls