Рекомендации по перезаписи URL-адреса

Я хотел бы сделать мои 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> 

Позвольте мне объяснить, что он делает (строка за строкой):

  • если существует модуль apache mod_rewrite.
    • включите модуль
    • пусть будет известно, что мы перепишем все, начиная с имени домена (только для перезаписи некоторых каталогов, использования RewriteBase /subdir/ )
    • если запрошенный путь не существует в виде файла …
    • и он даже не существует как каталог …
    • «перенаправить» запрос в файл index.php
  • закройте наше условие модуля

Вышесказанное – просто краткое объяснение. Вам не нужно это использовать.

Что мы сделали, так это то, что мы сказали Apache, что все запросы, которые закончились бы как 404, чтобы передать их в файл index.php, мы можем обработать запрос вручную.


Сторона 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, вот учебник:

http://www.workingwith.me.uk/articles/scripting/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, вам решать, как справиться с этим.