переписать правило для перенаправления на SEO-дружественный URL

#apache #redirect #mod-rewrite

#apache #перенаправление #мод-переписать

Вопрос:

Я создаю дружественный к SEO URL-адрес для страницы со строкой запроса, используя приведенный ниже код перезаписи

 RewriteRule certificates/finance curr/certificate.php?id=26 [L,QSA]
  

но теперь я хочу перенаправить с недружественного URL-адреса, т.е. curr / certificate.php?id=26, на более дружественный, т.е. certificates / finance, если кто-то зайдет на недружественный URL

Я попытался добавить следующий код

 RewriteCond %{QUERY_STRING} id=26
RewriteRule dir1/xyz.php /certificates/finance? [R=301,L]
  

но тогда я получаю слишком много ошибок перенаправления. Есть ли способ создать дружественный к SEO URL-адрес и заставить пользователей переходить на этот URL-адрес, если они переходят на не дружественный к SEO URL-адрес.

Спасибо за любую помощь.

Ответ №1:

Вам нужно сопоставить с %{THE_REQUEST} переменной вместо %{QUERY_STRING} . Поскольку вы сначала перенаправляете, а затем переписываете один и тот же запрос, ваш внутренний RewriteRule конфликтует с правилом с R флагом и вызывает ошибку бесконечного цикла.

 RewriteCond %{THE_REQUEST} /curr/certificate.php?id=26s [NC]
RewriteRule ^ /certificate/finance? [L,R]
RewriteRule certificates/finance curr/certificate.php?id=26 [L,QSA]
  

Если ваша версия apache 2.4 , вы также можете использовать END флаг в вашем RewriteRule, чтобы немедленно прекратить обработку перезаписи . Это позволит избежать ошибки бесконечного цикла при перенаправлении и перезаписи одного и того же запроса.

 RewriteCond %{QUERY_STRING} ^id=26$ [NC]
RewriteRule ^curr/certificate.php$ /certificate/finance? [L,R]
RewriteRule certificates/finance curr/certificate.php?id=26 [QSA,END]
  

Очистите кэш браузера перед тестированием этих новых перенаправлений.