Как я могу сделать свои URL-адреса удобными из этого примера?

#.htaccess #url #friendly-url

#.htaccess #url #дружественный-url

Вопрос:

В настоящее время мой сайт отображается следующим образом (при нажатии на объявление)::

 hxxp://mysite.com/viewItem.php?id=10
 

Я бы хотел, чтобы URL-адреса были прочитаны:

 hxxp://mysite.com/dogs/121/border-collie-for-sale-to-good-home  
 

где «собаки» всегда являются константой, 121 всегда является $row[‘postID’]; а «бордер-колли-для-продажи-в-хороший-дом» всегда является моим $row[‘title’];

Я знаю, что, вероятно, это будет не так просто, как быстрый ответ здесь, но был бы признателен, если бы вы могли направить меня в правильном направлении. Я предполагаю, что изменение .htaccess в порядке вещей, и я просто ужасно пытаюсь это расшифровать.

Комментарии:

1. mapfiles подойдут для этого

2. файлы карт? Я почти уверен, что это проблема htaccess, но что такое mapfiles?

3. httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritemap

4. RewriteMap не работает в .htaccess, только конфигурация сервера и vhost

Ответ №1:

Что-то, что вы можете сделать, это добавить перенаправление в начало viewItem.php сценарий. При этом перенаправлении необходимо будет проверить параметр запроса, который вы используете, чтобы указать, что файл .htaccess перезаписан. Что-то вроде этого:

 if( !isset($HTTP_GET_VARS['rewritten']) ) {
    // use whatever behind the scenes stuff you need to construct the friendly URL
    $friendly_url = "http://mysite/" . getCategory() . "/" . getID() . "/" . getTitle();

    // Now redirect the browser:
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: $friendly_url");
    exit();
}

// business as usual, the rest of your viewItem.php script.
 

Поэтому, когда этот php-скрипт пытается обработать запрос, у которого НЕТ rewritten параметра в строке запроса, он перенаправляет на дружественную версию URL. Если он есть rewritten , он делает то, что обычно делает, и обрабатывает запрос.

Теперь в файле .htaccess вы хотите переписать уродливый URL-адрес на удобный URL-адрес, но вам нужно включить rewritten его в перезапись (я предполагаю, что «121» в вашем примере — это «идентификатор», который viewItem.php сценарий принимает:

 RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^[^/] /([^/] )/ /viewItem.php?id=$1amp;rewritten=true [L]
 

Если вы оставите amp;rewritten=true там, он перейдет в цикл перенаправления. Вы также можете добавить a QSA в скобки правила, если хотите передать другие строки запроса вместе с перезаписью, если вы хотите иметь возможность обрабатывать удобные URL-адреса, например: http://mysite/dogs/121/border-collie-for-sale/?sort=asc При [L,QSA] этом «sort=asc» передается в viewItem/php.

Итак, это то, что происходит сейчас, когда кто-то нажимает на объявление и попадает на http://mysite/viewItem.php?id=121:

  1. В строке расположения браузера указано http://mysite/viewItem.php?id=121 , что запрос отправляется на mysite и viewItem.php доступен
  2. Верхняя часть viewItem.php видит, что rewritten параметра нет, поэтому перенаправляет браузер на http://mysite/dogs/121/border-collie-for-sale
  3. Поскольку это было перенаправление 301, строка местоположения браузера изменяется на http://mysite/dogs/121/border-collie-for-sale
  4. Запрос повторно отправляется на mysite, но на этот раз .htaccess перезаписывается /dogs/121/border-collie-for-sale на /viewItem.php?id=121amp;rewritten=true ВНУТРЕННИЙ, поэтому строка местоположения браузера не меняется.
  5. Запрос возвращает его к viewItem.php , на этот раз скрипт видит, что есть rewritten параметр, и выполняет это обычное дело, и запрос обслуживается

Вы можете использовать любое имя для параметра flag, которое вы хотите, если ни один из сценариев его не использует.