Что вы можете сделать, это добавить перенаправление вверху скрипта 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» в вашем примере - это «id», который принимает скрипт viewItem.php:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^[^/]+/([^/]+)/ /viewItem.php?id=$1&rewritten=true [L]
Если вы пропустите там &rewritten=true
, он пойдетв цикл перенаправления. Вы также можете добавить 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=121&rewritten=true
ВНУТРЕННЯ, поэтому строка адреса браузера не изменяется. - Запрос возвращается в viewItem.php, на этот раз скрипт видит, что есть параметр
rewritten
, и выполняет свою обычную работу, и запрос обрабатывается
. Вы можете использоватьлюбое имя для флага параметра, которое вы хотите, если ни один из сценариев не использует его.