Как я могу отобразить оптимизированные для SEO URL-адреса, используя mod_rewrite?
Я не являюсь разработчиком PHP в глубине души, и меня попросили выполнить некоторые SEO на существующем веб-сайте PHP.
Первое, что я заметил, были ужасные URL-адреса, поэтому я хочу, чтобы они переписывались на что-то более информативное. Вот все возможные шаблоны:
/index.php?m=ModuleType&categoryID=id
/index.php?m=ModuleType&categoryID=id&productID=id
/index.php?page=PageType
/index.php?page=PageType&detail=yes
В общем, я хочу преобразовать их в нечто вроде:
/ModuleType/Category
/ModuleType/Category/ProductName
/Page
/Page
Я не использовал mod_rewrite до того, как какой-либо совет или примеры будут великолепны!
Благодарю.
3 ответа
mod_rewrite лучше использовать для противоположного: переписать запросы /ModuleType/Category/ProductName
внутренне для /index.php?m=ModuleType&categoryID=id&productID=id
, Использование новых URL-адресов в документах является задачей вашего приложения.
Редактировать Вот пример того, как может выглядеть функция, которая превращает ваши параметризованные URL в новые:
function url($url, $rules) {
$url = parse_url($url);
parse_str($url['query'], $url['query']);
$argNames = array_keys($url['query']);
foreach ($rules as $rule) {
if ($rule[0] == $url['path'] && array_keys($rule[1]) == $argNames) {
$newUrl = $rule[2];
foreach ($rule[1] as $name => $pattern) {
if (!preg_match('/'.addcslashes($pattern, '/').'/', $url['query'][$name], $match)) {
continue 2;
}
$newUrl = str_replace('<'.$name.'>', $match[0], $newUrl);
}
return $newUrl;
}
}
return $url;
}
$rules = array(
array(
'/index.php',
array('m'=>'.*', 'categoryID'=>'.*', 'productID'=>'.*'),
'/<m>/<categoryID>/<productID>'
)
);
echo '<a href="' . url('/index.php?m=ModuleType&categoryID=categoryID&productID=productID', $rules) . '">/ModuleType/Category/ProductName</a>';
Я ни в коем случае не эксперт по mod_rewrite, но это пример того, как я собрал.htaccess для сайта Image Flair:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(.*)\.png$ imageFlair.php?mode=$1&userid=$2 [L]
RewriteRule ^(.*)\.png$ imageFlair.php?userid=$1 [L]
</IfModule>
Это в основном карты:
MODE / USERID.png -> imageFlair.php? Mode=MODE&userid=USERID
а также
USERID.png -> imageFlair.php? Userid = USERID
Вы должны быть в состоянии приспособить это к вашим потребностям, но у вас может быть несколько проблем:
- Если вы хотите использовать в именах "имена", а не идентификаторы, вам нужно изменить PHP, чтобы принимать имена.
- У вас может возникнуть проблема с конфликтом /Page и /ModuleType, если вы также хотите включить в Page больше параметров, если вы не можете собрать регулярное выражение, которое может определить, что есть что.
Идя по списку URL-адресов, которые вы хотите, это должно работать, хотя я не буду утверждать, что это лучший или единственный способ сделать это:-)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(.*)/(.*)$ index.php?m=$1&categoryID=$2&productID=$3 [L]
RewriteRule ^(.*)/(.*)$ index.php?m=$1&categoryID=$2 [L]
RewriteRule ^(.*)$ index.php?Page=$1 [L]
</IfModule>
Как и предполагалось, вы можете заменить.* На [^/]+, но у меня были проблемы с несоответствиями, когда я это делал, и у меня не было времени для устранения неполадок, поэтому YMMV:-)
Из вашего поста не совсем понятно, что это за переменные. Но при условии, что ModuleType
, id
(х2) и Page
все переменные, то следующие правила с обратными ссылками должны работать в пределах .htaccess
файл.
RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2&productID=$3 [L]
RewriteRule ^([^/]+)$ /index.php?page=PageType [L]
RewriteRule ^([^/]+)/detail$ /index.php?page=PageType&detail=yes [L]
Последнее не имело смысла, как вы написали. Так что вместо этого вы можете добавить /detail
в конце.
Они должны скользить прямо поверх существующих приложений без каких-либо изменений в приложении. Потому что они не перенаправляют с [R]
это будет прозрачно для ваших пользователей.