我觉得有点愚蠢地问这个 - 就像我应该可以通过谷歌搜索找到 - 但我没有找到关于这个主题的任何真正好的,有争议的想法。
我正在考虑将我的网址从动态http://www.example.com/?section=news&news_id=42
重写为静态http://www.example.com/news/42/awesome-news-item-title
- 我已经找到了解决这个问题的方法,并且结果很多。现在,在我的网站上实现这一点之前,我希望对浏览器性能有一些中立的输入。
我发现的所有来源都说静态网址更适合搜索引擎优化(除了这个google webmaster central blogpost) - 他们肯定在可读性方面更加用户友好。
只是我觉得网站使用重写加载waaay的时间更长。
RewriteRule ^news/([0-9]+)(\/[a-z-]+)?$ /index.php?section=news&news_id=$1&title=$2
所以,我的一堆问题是:
http://www.example.com/news/42/example-com-is-stupid
之类的内容)答案 0 :(得分:1)
老实说对mod_rewrite
的效果一无所知,但我可以告诉你:
This ruleset relies on HostNameLookups being set on, which can be a significant performance hit.
(并且没有基本的重写类型)。作为旁注,许多CRM将所有网址重定向到index.php
并使用网址路由器(请参阅项目中的源代码,如klein.php或Slim)来处理所有网址要求。如果您主要为/news
之类的内容提供动态内容,则可能不需要对项目范围进行此操作。但是,如果您开始为多个不同的网址(例如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调用路由到不同的类和函数。
答案 1 :(得分:1)
不确定性能,但这是一个类似于我使用的示例。我将url标题创建为数据库中的记录,并按标题而不是id来提取记录。这样,如果有人想尝试操纵标题,请求将无效。另外,它有助于SEO。
<?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]