重写 php 应用程序以获得 seo 友好的 url
Posted
技术标签:
【中文标题】重写 php 应用程序以获得 seo 友好的 url【英文标题】:rewriting php application to get seo friendly url's 【发布时间】:2012-05-30 02:34:32 【问题描述】:我的 php 应用程序必须部分重写,因为客户要求拥有 SEO 友好的网址。
我的链接如下:
www.mysite.com/articles_en.php?artid=89,我将不得不更改此处的网址:
www.mysite.com/articleTitle
然后我有这个网址:
www.mysite.com/halls.php?fairid=65 应该变成
www.mysite.com/fairname
而 www.mysite.com/companies.php?fairid=65&hallid=23 应该变成
www.mysite.com/fairname/hallname
你明白了。
我需要有关方法的帮助。在展会、大厅和文章的表中创建一个名为例如别名的表中的字段然后尝试重写 url 是否是个好主意?任何人都可以帮助我完成创建此脚本的步骤,或指出更好的方法?
我擅长 php,但不擅长正则表达式,所以我会迷失在 .htaccess 部分。
任何帮助将不胜感激。
问候,卓然
【问题讨论】:
【参考方案1】:.htaccess 类似:
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([^?]*) /url_rewrite.php?path=$1 [L,QSA]
数据库表类似:
+------+--------+
| path | url |
+------+--------+
以路径为 PRIMARY KEY。
还有一个名为 url_rewrite.php
的 PHP 脚本,它从 URL 中获取路径参数,在数据库中查找真正的 url 并执行 HTTP 301 重定向。
url_rewite.php 页面可能看起来像这样(这几乎是样板代码,需要根据您的要求进行调整 - 实际上我们不应该再使用 mysql_query() - PDO 或 MySQLi 更好,并且'不好,已弃用)。
<?php
// -- database connection and any intialisation stuff you may have might go here ...
//get the path
$sPath = !empty($_GET['path']);
// -> error trapping for empty paths here
//retrieve the "real" url from the database
$dbQry = mysql_query("SELECT `url` FROM `seourls` WHERE `path` = '" . mysql_real_escape_string($sPath) . "' LIMIT 0, 1");
// -> error trapping here for query errors here
$dbResponse = mysql_fetch_row($dbQuery);
// -> error trapping here for empty recordsets here
$sRealPath = $dbResponse[0]; # which might be "/articles_en.php?artid=89"
//redirect
header("HTTP/1.1 302 Found");
header("Status: 302 Found"); # for Chrome/FastCGI implementation
header("Location: $sRealPath");
die();
?>
【讨论】:
不确定我是否理解...path 将是 articlename 而 ulr 将是 article.php?artid=22? 另外,我的链接应该是什么?我可以保留现有的链接吗,就像我现在拥有的那样 article name 这是我到目前为止所做的。我使用路径(varchar 255)作为主键和 url(varchar 255)创建了表 seourls。我目前的字段如下: path=add-your-company url=articles.php?artid=89 现在,我正在编写 rewrite_url.php 脚本。如果您看到这些帖子,请告诉我我是否走在正确的道路上……将在此处发布更新。 网址重写现已完成。这是代码: [code] function curPageURL() $url = $_SERVER["REQUEST_URI"]; $path=mysql_result(mysql_query("SELECT path FROM seourls WHERE url='$url'"),0,"path");返回$路径; [/code]【参考方案2】:我建议您仔细查看 SO 上这个问题的漂亮 URL 并获得一些想法。不用说,SO 问题在 Google 搜索结果中的排名非常高。因此,从 SO URL 约定中获取线索,我建议您使用这 3 种漂亮的 URL 格式:
-
/articles/89/mytitle 为
/articles_en.php?artid=89
/halls/65/sometitle 代表/halls.php?fairid=65
/companies/65-23/company 代表/companies.php?fairid=65&hallid=23
现在创建 3 个查找表 articles
、halls
和 companies
,如下所示:
表格:文章:
+-------+-------+
| artid | title |
+-------+-------+
桌厅:
+--------+-------+
| fairid | title |
+--------+-------+
表公司:
+--------+--------+------+
| fairid | hallid | name |
+--------+--------+------+
现在对于上述 3 个漂亮的 URL 处理,将此代码添加到您的 .htaccess 中 $DOCUMENT_ROOT
下:
RewriteCond %QUERY_STRING ^artid=\d+$ [NC]
RewriteRule ^articles_en\.php/?$ router.php?handler=article [L,NC,QSA]
RewriteRule ^articles/(\d+)/?(.*)$ router.php?handler=article&artid=$1&title=$2 [L,NC,QSA]
RewriteCond %QUERY_STRING ^fairid=\d+$ [NC]
RewriteRule ^halls\.php/?$ router.php?handler=hall [L,NC,QSA]
RewriteRule ^halls/(\d+)/?(.*)$ router.php?handler=hall&fairid=$1&title=$2 [L,NC,QSA]
RewriteCond %QUERY_STRING ^fairid=\d+&hallid=\d+$ [NC]
RewriteRule ^companies\.php/?$ router.php?handler=company [L,NC,QSA]
RewriteRule ^companies/(\d+)-(\d+)/?(.*)$ router.php?handler=company&fairid=$1&hallid=$2&name=$3 [L,NC,QSA]
终于有你的router.php
代码如下:(示例代码)
<?php
// TODO: Add sanitization checks for presence of required parameters e.g. handler and lookup failures
$handler = mysql_real_escape_string($_GET['handler']);
switch ($handler)
case 'article':
$artid = mysql_real_escape_string($_GET['artid']);
$title = mysql_real_escape_string($_GET['title']);
if (empty($title))
#header("HTTP/1.1 301 Moved Permanently");
header("Location: /articles/$artid/" . lookupArticle($artid));
exit;
else
require_once("articles_en.php");
break;
case 'hall':
$fairid = mysql_real_escape_string($_GET['fairid']);
$title = mysql_real_escape_string($_GET['title']);
if (empty($title))
#header("HTTP/1.1 301 Moved Permanently");
header("Location: /halls/$fairid/" . lookupHall($fairid));
exit;
else
require_once("halls.php");
break;
case 'company':
$fairid = mysql_real_escape_string($_GET['fairid']);
$hallid = mysql_real_escape_string($_GET['hallid']);
$name = mysql_real_escape_string($_GET['name']);
if (empty($name))
#header("HTTP/1.1 301 Moved Permanently");
header("Location: /companies/$fairid-$hallid/" . lookupCompany($fairid, $hallid));
exit;
else
require_once("companies.php");
break;
function lookupArticle($artid)
// $title = mysql_result(mysql_query("SELECT title FROM articles WHERE artid=$artid"), 0, "title");
static $articles = array(89 => 'Title\'s A', 90 => 'Title, 1B', 91 => '@Article= C');
return normalize($articles[$artid]);
function lookupHall($fairid)
// $title = mysql_result(mysql_query("SELECT title FROM halls WHERE fairid=$fairid"), 0, "title");
static $halls = array(65 => 'Hall+ A', 66 => 'Hall B', 67=> 'Hall C');
return normalize($halls[$fairid]);
function lookupCompany($fairid, $hallid)
// $title = mysql_result(mysql_query("SELECT name FROM companies WHERE fairid=$fairid and hallid=$hallid"), 0, "name");
static $companies = array('65-23' => 'Company% A', '66-24' => 'Company B', '67-25' => '(Company) C');
return normalize($companies[$fairid .'-'. $hallid]);
function normalize($str)
return preg_replace(array('#[^\pL\d\s]+#', '#\s+#'), array('', '-'), strtolower($str));
?>
一旦您确认它工作正常,请取消注释 301 Moved Permanently
行以获得更好的 SEO 结果。
PS:我已经使用normalize
PHP 函数来获取所有小写的 URL 文本,清除特殊字符并将所有空格转换为连字符。
【讨论】:
@Zoran:对不起,我错过了你的评论。如有机会,请在 cmets 中留下您的问题。以上是关于重写 php 应用程序以获得 seo 友好的 url的主要内容,如果未能解决你的问题,请参考以下文章
htaccess url 重新样式化图像 url 到 seo 友好