2010-11-03 50 views
0

我有一个基于PHP的网站,其中包含动态页面,例如/page.php?ID=1。 URL中的ID表示具有“名称”字段的条目的MySQL数据库中的唯一键。 据我所知,为了将所有我的URL从/page.php?ID=1转换到/ page/New-York(其中行ID = 1的名称字段是纽约),我需要使用.htaccess文件。将多个动态页面转换为静态

什么是最好的方法来做到这一点?如何使用下列内容:

RewriteEngine on 
RewriteCond %{QUERY_STRING} ^ID=1$ 
RewriteRule ^/page.php$ http://www.example.com/page/New-York [L,R=301] 

但在某种程度上,它会检索名称(在这种情况下,纽约)从MySQL数据库,对所有项目吗?


编辑:

Repox的答案是下一步非常好,那就是如何一次我设置了静态的URL抓取从数据库的条目。

但是,我还需要从另一个问题开始:由于我的网站已有两三年历史,因此Google已将所有网页编入索引,因此/page.php?ID=2/page.php?ID=3已位于Google的数据库中。所以,我需要建立一个301重定向(在.htaccess)为每个现有的页面到新的页面,即:

redirect 301 /page.php?ID=1 /page/new-york 
redirect 301 /page.php?ID=2 /page/berlin 
and so on... 

有没有更好的(也许更有效)的方式来做到这一点,而不是只写2500行条目和他们的目标?我看到的问题是,我无法从.htaccess文件查询我的数据库,因此没有办法创建一个简短的规则。

感谢,

乔尔

回答

0

你将不得不让PHP解释的页面为您服务。

简单的方法是将字段添加到您的表中,称为Webname,并且对于名为'New York'的页面,Web安全名称将为'New-York'。

page.php然后将查询表的Webname而不是pageId。

你的.htaccess应该再看看更多的是这样的:那么

RewriteEngine On 
RewriteRule ^page/?$ page.php?pageName=$1 [NC,L] 

你的网络安全页面名称将在$ _GET [ “页面名”] page.php文件可用。

+0

由于我用用户插入的文本查询字段(某人可以使用/ page/Made-Up-Name)我需要额外注意什么?是mysql_real_escape_string($ _ GET [“pageName”]);足够? – Joel 2010-11-03 09:41:59

+0

它应该是 - 用户生成输入的问题往往是经常犯的错误。但是我会提供一些确保websafename只包含允许的字符的东西 - 例如:$ Webname = ereg_replace(“[^ A-Za-z0-9]”,“ - ”,$ string_to_be_stripped); – Repox 2010-11-03 09:51:45

+0

谢谢!我编辑了我的问题:) – Joel 2010-11-03 12:52:39