Пожалуйста, совет по переписыванию URL

#php #apache #url-rewriting

#php #apache #url-перезапись

Вопрос:

Я хотел бы сделать свои URL-адреса более удобными для seo и, например, изменить это:

http://www.chillisource.co.uk/product?amp;cat=Groceryamp;q=Daves Gourmetamp;page=1amp;prod=B0000DID5Ramp;prodName=Daves_Insanity_Sauce

к чему-то хорошему вроде этого:

 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, вот руководство:

http://www.workingwith.me.uk/articles/scripting/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 получит подчеркнутое значение, а не , поэтому также потребуется некоторое исправление.
Как вы можете видеть, я не трогал идентификатор и категорию, вам решать, как с этим справиться.