2

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

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

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

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

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

4

9 回答 9

3

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

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

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

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

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

于 2009-01-04T18:50:48.380 回答
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 可以潜在地提高性能和可伸缩性,并且它是通过缓存完成的。如果您返回正确的缓存标头(请参阅HTTP 文档中的缓存控制指令),那么它将使下游服务器能够缓存数据,因此您甚至不会在您的站点上获得点击。但是,我想您也可以使用静态页面获得同样的好处 :) 我恰好在一两天前在 High Scalability 博客上读到了一篇关于这个主题的文章:http: //highscalability.com/strategy-understanding-your -data-leads-best-scalability-solutions

于 2009-01-04T19:20:47.727 回答
1

它通常通过重写引擎完成,可以在服务器中(通过类似 Apache 中的 mod_rewrite 之类的东西)或在 Web 应用程序中(所有请求都被路由到 Web 应用程序,它为指定的路径查找路由)。

于 2009-01-04T18:48:19.930 回答
1

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

Apache 的 mod_rewrite 是最常见的。

于 2009-01-04T18:56:45.700 回答
0

就我而言,我坚持使用已经内置此功能的 Web 框架。(代码点火器)

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

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

于 2009-01-04T19:01:50.603 回答
0

可以重写

  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', array('controller' => 'news'));

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

动态路线的一个例子是

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

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

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

于 2009-01-04T19:06:46.443 回答
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 将其修剪为上述内容。)

于 2009-01-04T20:01:59.500 回答
0

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

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

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

于 2009-01-04T23:25:09.637 回答
0

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

成功的网址

于 2009-01-05T13:11:45.863 回答