Пожалуйста, совет переписать URL - PullRequest
0 голосов
/ 08 ноября 2011

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

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, но это кажется очень сложным.

Заранее спасибо

Ответы [ 5 ]

2 голосов
/ 08 ноября 2011

Бен Патон, на самом деле есть очень простой выход.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 соответственно, но это другая история.:)

1 голос
/ 08 ноября 2011

Это называется mod_rewrite, вот учебник:

http://www.workingwith.me.uk/articles/scripting/mod_rewrite

0 голосов
/ 08 ноября 2011

Я должен добавить: в вашем исходном URL есть ключ 'prod', который, кажется, состоит из идентификатора. Убедитесь, что при переключении на переписанные URL-адреса вы больше не зависите исключительно от уникального идентификатора, поскольку он не будет отображаться в URL-адресе. Теперь вы можете использовать идентификатор, чтобы различать два продукта с одинаковым именем, но в случае переписывания URL-адресов и необходимости более не требовать идентификатора в URL-адресе необходимо убедиться, что одно имя продукта не может использоваться несколько раз для разных товары. Аналогично, я вижу, что клавиша «cat» отсутствует в желаемом выходном URL-адресе, то же самое относится и к описанному выше.

Независимо от вышеописанных «проблем», переписывание должно выглядеть примерно так:

RewriteRule ^/product/(.*?)/(.*?)$ /product?&cat=Grocery&q=$1&page=1&prod=B0000DID5R&prodName=$2

q & prodName получит подчеркнутое значение, а не% 20, поэтому также потребуется некоторое исправление. Как видите, я не касался идентификатора и категории, вам решать, как с этим справиться.

0 голосов
/ 08 ноября 2011

попробуйте что-нибудь подобное

RewriteRule ^/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)  /$1.php?id1=$2&id2=$3 [QSA]

, затем используйте $_GET для получения значений параметров ...

0 голосов
/ 08 ноября 2011

Как насчет использования переменной окружения PATH_INFO?

$path=explode("/",getenv("PATH_INFO"));
echo($path[0]."; ".$path[1] /* ... */);

Будет выводить

product; Daves_Gourmet; Daves_insanity_Sauce

Переход от использования $_GET к использованию PATH_INFO среды - хорошее программированиеупражнение.Я думаю, что вы не можете просто выполнить задачу с конфигурацией.

...