I suggest you to carefully look at the pretty URL of this question on SO and get some idea. Needless to add that SO questions rank very high on Google search results. So taking a clue from SO URL conventions, I suggest you these 3 pretty URL formats:
- /articles/89/mytitle for
/articles_en.php?artid=89
- /halls/65/sometitle for
/halls.php?fairid=65
- /companies/65-23/company for
/companies.php?fairid=65&hallid=23
Now create 3 lookup tables articles
, halls
and companies
like this:
Table: articles:
+-------+-------+
| artid | title |
+-------+-------+
Table halls:
+--------+-------+
| fairid | title |
+--------+-------+
Table companies:
+--------+--------+------+
| fairid | hallid | name |
+--------+--------+------+
Now for above 3 pretty URL handling add this code in your .htaccess under $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]
Finally have your router.php
code like this: (sample code)
<?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));
}
?>
Once you verify that it's working fine uncomment 301 Moved Permanently
lines to get better SEO results.
PS: I have used normalize
PHP function to get all URL text in lowercase, cleaning up special characters and converting all spaces to hyphens.