2014-04-03 121 views
0

我觉得有点愚蠢的要求 - 像我应该能够通过谷歌搜索找到 - 但我还没有发现任何真正的好主意,有争议的主题。浏览器性能:动态网址vs静态网址

我在考虑将我的网址从动态http://www.example.com/?section=news&news_id=42重写为静态http://www.example.com/news/42/awesome-news-item-title - 我已经发现如何解决这个问题,并且很喜欢这个结果。现在,在我的网站上实现此功能之前,我希望对浏览器性能有一些中立的意见。

我发现所有的资源都说上述静态URL更适合搜索引擎优化(除了这个google webmaster central blogpost) - 他们确信地狱在可读性方面更加用户友好。

这只是我的网站加载waaay使用重写的印象。

RewriteRule ^news/([0-9]+)(\/[a-z-]+)?$ /index.php?section=news&news_id=$1&title=$2 

所以,我的一大堆的问题是:

  • 如何mod_rewrite的影响浏览器的性能?
  • 无论如何您会重写网址吗?
  • 有没有比我使用的更好的方法吗?
  • 我会用this answer为我的新闻标题进行网址编码。同意?更好的建议?
  • 有什么我真的不得不注意的吗? (除如果在URL中给出的标题我的新闻,以避免像http://www.example.com/news/42/example-com-is-stupid事情标题匹配检查)
+1

重写发生服务器端,除非您重定向或东西。 – AmazingDreams

回答

1

不确定性能,但这里是一个类似于我使用的示例。我创建网址标题作为数据库中的记录,并按标题而不是标识拉取记录。这样,如果有人想尝试操纵标题,请求将无效。另外,它有助于搜索引擎优化。

<?php 

function route($path_position) { 
    $url_path = $page_path = explode("/",$_SERVER['REQUEST_URI']); 
    return filter_var($url_path[$path_position],FILTER_SANITIZE_URL); 
} 

$section = route(1); 
$news_id = route(2); 
$url_news_title = route(3); 

$query = "SELECT * FROM news_table WHERE url_news_title = :url_news_title"; 
echo "/" . $section . "/" . $news_id . "/" . $url_news_title; 

我用下面的.htaccess文件与此:

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] 
+0

,这听起来真的很有趣 - 我也想过这样的事情,但犹豫了起来标题必须是唯一的,对吧?你如何处理重复?添加一个数字?也许添加日期? –

+1

@Mazzekazze你可以在'INSERT'上检查一下,如果URL标题是重复的,就会在URL标题中加上'-2'。 – Sam

+1

是的,标题必须是唯一的,但是,您也可以匹配新闻ID: $ query =“SELECT * FROM news_table WHERE id =:id AND url_title =:url_title – Rob

1

老实说有对mod_rewrite性能不知道,但我可以告诉你:

  1. 它不会影响“浏览器性能”,因为它发生在服务器上。
  2. Apache hints没有太多的性能影响,因为它为“重定向到地理分布式服务器”(没有基本的重写类型)指定This ruleset relies on HostNameLookups being set on, which can be a significant performance hit.
  3. 静态URL的SEO/clean方面将大大超过任何性能命中,这就是人们继续使用它们的原因。

作为一个侧面说明,有很多的CRM重定向所有URL到index.php和使用URL路由器(请参阅从像klein.phpSlim一个项目的源代码)来处理所有的请求。如果您主要拥有像/news这样简单的动态内容,则可能不需要您的项目范围。但是如果你开始为多个不同的URL创建重写规则(如news,categories,authors),那么将所有请求路由到index.php并使用PHP查看访问哪个URL以及使用哪个函数将会更容易和更高效“路由请求”到。


针对您的评论:

我(和普通)重写规则是类似如下:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [L,QSA] 

这种重定向是一个所有请求文件或目录index.php。这意味着任何时候都会尝试访问存储库中存在的文件,它会直接提供这些文件(所以图像,样式,脚本,甚至是公共目录中的PHP脚本)。换句话说,可缓存的内容不受影响,您可以使用index.php$_SERVER['REQUEST_URI']将URL调用路由到不同的类和函数。

+0

感谢您的回答,的确我使用index.php来处理所有请求。关于浏览器的性能,我有一种感觉,像图片和CSS等潜在的缓存内容被重新加载了重写的静态URL,而良好的动态链接则不是 - 尽管我为这些文件设置了1年过期规则......也许我应该再看一遍。 –

+0

@Mazzekazze更新了我的答案。 – Sam

+2

如果你想能够访问URL中的$ _GET请求,RewriteRule将不得不包含[L,QSA],而不仅仅是[L] – Rob