Я не разработчик 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, прежде чем какие-либо советы или примеры были бы замечательными!
Благодарю.
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
Вы должны уметь адаптировать это к вашим потребностям, но у вас может быть несколько проблем:
Переходя к списку 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
(x2) и Page
являются всеми переменными, тогда следующие правила с ModuleType
должны работать в файле .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]
они будут прозрачными для ваших пользователей.