#php #apache #url-rewriting
#php #apache #url-перезапись
Вопрос:
Я хотел бы сделать свои URL-адреса более удобными для seo и, например, изменить это:
к чему-то хорошему вроде этого:
http://www.chillisource.co.uk/product/Daves_Gourmet/Daves_Insanity_Sauce
Каков наилучший способ сделать это? Я посмотрел, как это сделать с файлом htaccess, но это кажется очень сложным.
Заранее спасибо
Комментарии:
1. Ваш исходный URL-адрес содержит больше параметров, чем ваша переписанная версия…
2. .htaccess — правильный способ сделать это. Так что обдумайте эту сложность 🙂 На самом деле, это просто регулярные выражения.
Ответ №1:
Бен Патон, на самом деле есть очень простой выход. CMS, такие как WordPress, обычно используют его вместо того, чтобы возиться с регулярными выражениями.
.htaccess
Сторона
Во-первых, вы используете файл .htacess с нижеприведенным содержимым:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Позвольте мне объяснить, что это делает (построчно):
- существует ли модуль Apache с именем mod_rewrite..
- включите модуль
- да будет известно, что мы перепишем все, что начинается после имени домена (чтобы переписать только некоторые каталоги, используйте
RewriteBase
)
/subdir/ - если запрошенный путь не существует в виде файла…
- и это даже не существует как каталог…
- запрос «перенаправить» на index.php файл
- закройте условие нашего модуля
Вышесказанное — всего лишь краткое объяснение. На самом деле вам это не нужно, чтобы использовать это.
Что мы сделали, так это то, что мы сказали Apache, что все запросы, которые в конечном итоге будут 404-мя, должны передаваться в index.php файл, в котором мы можем обработать запрос вручную.
Сторона PHP
На стороне PHP, внутри index.php
, вам просто нужно проанализировать исходный URL. Этот URL передается в $_SERVER
переменной как $_SERVER['REDIRECT_URL']
.
Самое приятное, что если перенаправления не было, эта переменная не установлена!
Итак, наш код в конечном итоге будет выглядеть:
if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
$url = explode('/', $_SERVER['REDIRECT_URL'] );
switch($url[0]){
case 'home': // eg: /home/
break;
case 'about': // eg: /about/
break;
case 'images': // eg: /images/
switch( $url[1] ){
case '2010': // eg: /images/2010/
break;
case '2011': // eg: /images/2011/
break;
}
break;
}
}
Простая интеграция
Я чуть не забыл упомянуть об этом, но, благодаря тому, как это работает, вы можете даже в конечном итоге вообще не изменять свой существующий код!
Меньше разговоров, больше примеров. Допустим, ваш код выглядел как:
<?php
$page = get_page($_GET['id']);
echo '<h1>'. $page->title .'</h1>';
echo '<div>'. $page->content .'</div>';
?>
Который работал с URL-адресами, такими как:
index.php?id=5
Вы можете заставить его работать с SEO-URL-адресами, а также одновременно сохранить его в вашей старой системе. Во-первых, убедитесь, что .htaccess
содержит код, который я написал в приведенном выше.
Затем добавьте следующий код в самом начале вашего файла:
if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
$url = explode('/', $_SERVER['REDIRECT_URL'] );
$_GET['id'] = $url[0];
}
Что мы здесь делаем? Прежде чем перейти к двум вашим собственным кодам, мы в основном находим идентификаторы и информацию из старого URL-адреса и передаем их в переменную PHP $_GET.
По сути, мы обманываем ваш код, заставляя думать, что в запросе были эти переменные!
Единственное оставшееся препятствие — найти все эти надоедливые <a/>
теги и заменить их href
соответствующим образом, но это уже другая история. 🙂
Ответ №2:
Это называется mod_rewrite, вот руководство:
Комментарии:
1. Руководство отличное, но неадекватное. Это также ничего не упрощает, и вместо этого получается спагетти-код. 1 за руководство, -1 за непрактичность. 🙂
Ответ №3:
Как насчет использования PATH_INFO
переменной окружения?
$path=explode("/",getenv("PATH_INFO"));
echo($path[0]."; ".$path[1] /* ... */);
Выведет
product; Daves_Gourmet; Daves_insanity_Sauce
Переход от использования среды $_GET
к использованию PATH_INFO
среды — хорошее упражнение в программировании. Я думаю, вы не можете просто выполнить задачу с помощью конфигурации.
Ответ №4:
попробуйте что-нибудь вроде этого
RewriteRule ^/([a-zA-Z0-9] )/([a-zA-Z0-9] )/([a-zA-Z0-9] ) /$1.php?id1=$2amp;id2=$3 [QSA]
затем используйте $_GET
для получения значений параметров…
Комментарии:
1. Отлично подходит для кошмара сопровождающего 🙂
Ответ №5:
Я должен добавить: в вашем исходном URL есть ключ ‘prod’, который, похоже, состоит из идентификатора. Убедитесь, что при переключении на перезаписанные URL-адреса вы больше не зависите исключительно от уникального идентификатора, потому что он не будет виден в URL. Теперь вы можете использовать идентификатор, чтобы провести различие между двумя продуктами с одинаковым названием, но в случае переписывания URL-адресов и больше не требовать ID в URL-адресе, вам нужно убедиться, что название 1 продукта не может использоваться несколько раз для разных продуктов. Аналогично, я вижу, что ‘cat’-key отсутствует в желаемом выходном URL, применяется то же самое, что описано выше.
Не обращая внимания на описанные выше «проблемы», перезапись должна примерно выглядеть:
RewriteRule ^/product/(.*?)/(.*?)$ /product?amp;cat=Groceryamp;q=$1amp;page=1amp;prod=B0000DID5Ramp;prodName=$2
q amp; prodName получит подчеркнутое значение, а не , поэтому также потребуется некоторое исправление.
Как вы можете видеть, я не трогал идентификатор и категорию, вам решать, как с этим справиться.