Я хотел бы сделать мои URL более дружественными к SEO и, например, изменить это:
http://www.chillisource.co.uk/product?&cat=Grocery&q=Daves%20Gourmet&page=1&prod=B0000DID5R&prodName=Daves_Insanity_Sauce
к чему-то приятному:
http://www.chillisource.co.uk/product/Daves_Gourmet/Daves_Insanity_Sauce
Каков наилучший способ сделать это? Я посмотрел на это с файлом htaccess, но это кажется очень сложным.
заранее спасибо
Бен Патон, на самом деле очень простой выход. CMS, такие как WordPress, как правило, используют его вместо того, чтобы возиться с регулярными выражениями.
.htaccess
Во-первых, вы используете .htacess с содержанием ниже:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Позвольте мне объяснить, что он делает (строка за строкой):
RewriteBase /subdir/
) Вышесказанное – просто краткое объяснение. Вам не нужно это использовать.
Что мы сделали, так это то, что мы сказали Apache, что все запросы, которые закончились бы как 404, чтобы передать их в файл index.php, мы можем обработать запрос вручную.
На стороне PHP внутри index.php
вам просто нужно проанализировать исходный URL. Этот URL-адрес передается переменной $_SERVER['REDIRECT_URL']
как $_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
Вы можете заставить его работать с URL-адресами SEO, а также сохранять его вместе со своей старой системой одновременно. Во-первых, убедитесь, что .htaccess
содержит код, который я написал в приведенном выше.
Затем добавьте следующий код в самом начале вашего файла:
if ( isset( $_SERVER['REDIRECT_URL'] ) ) { $url = explode('/', $_SERVER['REDIRECT_URL'] ); $_GET['id'] = $url[0]; }
Что мы здесь делаем? Прежде чем перейти к двум своим собственным кодам, мы в основном находим идентификаторы и информацию из старого URL-адреса и загружаем их в переменную $ _GET PHP. Мы по сути дураем ваш код, чтобы думать, что запрос имел эти переменные!
Единственное оставшееся препятствие, чтобы найти все эти <a/>
теги <a/>
и заменить их href
соответственно, но это совсем другая история. 🙂
Это называется mod_rewrite, вот учебник:
Как насчет использования PATH_INFO
среды PATH_INFO
?
$path=explode("/",getenv("PATH_INFO")); echo($path[0]."; ".$path[1] /* ... */);
Выйдет
product; Daves_Gourmet; Daves_insanity_Sauce
Переход от использования $_GET
к использованию среды PATH_INFO
– это хорошее упражнение по программированию. Я думаю, вы не можете просто выполнить задачу с настройкой.
попробуй что-нибудь вроде этого
RewriteRule ^/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+) /$1.php?id1=$2&id2=$3 [QSA]
затем используйте $_GET
чтобы получить значения параметров …
Я должен добавить: в вашем исходном URL-адресе есть ключ «prod», который, как представляется, состоит из идентификатора. Убедитесь, что при переключении на перезаписанные URL-адреса вы больше не зависите только от уникального идентификатора, потому что это не будет видно в URL-адресе. Теперь вы можете использовать идентификатор, чтобы сделать различие между двумя продуктами с тем же именем, но в случае перезаписи URL-адресов и отсутствия идентификатора в URL-адресе вам необходимо убедиться, что одно имя продукта не может использоваться несколько раз для разных продукты. Аналогично, я вижу, что «cat» не присутствует в желаемом выходном URL-адресе, как это описано выше.
Невзирая на описанные выше «проблемы», переписывание должно выглядеть так:
RewriteRule ^/product/(.*?)/(.*?)$ /product?&cat=Grocery&q=$1&page=1&prod=B0000DID5R&prodName=$2
Q & prodName получит подчеркнутое значение, а не% 20, поэтому также потребуется некоторое исправление. Как вы можете видеть, я не касался id & category, вам решать, как справиться с этим.