#.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:
- В строке расположения браузера указано
http://mysite/viewItem.php?id=121
, что запрос отправляется на mysite и viewItem.php доступен - Верхняя часть viewItem.php видит, что
rewritten
параметра нет, поэтому перенаправляет браузер на http://mysite/dogs/121/border-collie-for-sale - Поскольку это было перенаправление 301, строка местоположения браузера изменяется на http://mysite/dogs/121/border-collie-for-sale
- Запрос повторно отправляется на mysite, но на этот раз .htaccess перезаписывается
/dogs/121/border-collie-for-sale
на/viewItem.php?id=121amp;rewritten=true
ВНУТРЕННИЙ, поэтому строка местоположения браузера не меняется. - Запрос возвращает его к viewItem.php , на этот раз скрипт видит, что есть
rewritten
параметр, и выполняет это обычное дело, и запрос обслуживается
Вы можете использовать любое имя для параметра flag, которое вы хотите, если ни один из сценариев его не использует.