Перенаправление с URL-адреса с параметрами на удобный для SEO URL-адрес в.htaccess
У меня есть страница категории с такой структурой
example.com/Category.php?Category_Id=10&Category_Title=some-text
Я хочу написать правила htaccess для перенаправления с
example.com/Category.php?Category_Id=10&Category_Title=some-text
К этому
example.com/Category/10/some-text
Есть ли какой-либо способ заставить htaccess сделать это. я хочу, когда я посещаю
example.com/Category.php?Category_Id=10&Category_Title=some-text
Страница категории автоматически перенаправляется на
example.com/Category/10/some-text
Я использую этот код htaccess, но он не перенаправляет страницу на удобный для seo URL
Options -Multiviews
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^exmaple\.com$
RewriteRule ^(.*) http://exmaple.com/$1 [R=301,L]
Как я могу это сделать?
2 answers
Tl; др
# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]
Я изменил сгенерированную ссылку с плохой seo-структуры на seo-дружественную структуру, и она работает
Справедливо, рад, что вы разобрались, я полагаю, вы используете какую-то CMS? (Это, вероятно, добавило что-то к вашему .htaccess
Я бы подумал?)
В любом случае, чтобы ответить на ваш первоначальный вопрос(ы)...
Я: вы уже изменили URL-адрес в своем приложении на "красивый" формат? например. URL-адрес, который пользователь видит на странице, является
example.com/Category/10/some-text
, а неexample.com/Category.php?Category_Id=10&Category_Title=some-text
?Вы: да. но это много.я должен сделать все URL-адреса красивыми на всех страницах, и я делаю это сейчас. но я хочу знать, есть ли решение htaccess, которое я делаю.итак, вы говорите, что изменение URL-адреса на всех страницах - это единственное решение...
Хотя технически это возможно реализовать исключительно в .htaccess
, без фактического изменения URL-адресов в вашем приложении, это не рекомендуется. Это привело бы к плохому пользовательскому опыту и потенциально может нанести ущерб SEO вашего сайта.
Если вы не изменили URL-адрес в своем приложении, то каждый раз, когда пользователь нажимал внутреннюю ссылку, он получал внешнее перенаправление (второй запрос) на канонический URL-адрес (до тех пор, пока перенаправление не было кэшировано). Это дополнительный (ненужный) запрос на вашем сервере. Старый URL-адрес будет доступен пользователю и доступен для копирования (например, "Адрес ссылки для копирования").
Обычно единственная причина для реализации такого перенаправления заключается в том, что старый URL-адреса уже были связаны и/или поисковые системы уже проиндексировали старую структуру URL-адресов. Затем перенаправление требуется для сохранения SEO.
Внутренняя переписка (новый "красивый" URL на старый "уродливый" URL)
Чтобы реализовать такую удобную для пользователя структуру URL-адресов, вам потребуется внутренняя перезапись , которая автоматически переписывает запрос с нового "красивого" URL-адреса обратно на старый "уродливый" (реальный) URL-адрес. Пользователь видит только новый "красивый" URL-адрес. Предполагается, что из ваш вопрос о том, что у вас уже было что-то подобное (может быть, и нет)? Например:
# Rewrite /Category/10/some-text
RewriteRule ^Category/(\d+)/([\w-]+)$ Category.php?Category_Id=$1&Category_Title=$2 [L]
$1
и $2
являются обратными ссылками на захваченные группы в RewriteRule
шаблон. т.е. \d+
и [\w-]+
соответственно.
Если бы это был новый сайт, то вы могли бы остановиться на этом, однако...
Внешнее перенаправление (старый "уродливый" URL на новый "красивый" URL) - необязательно
Это перенаправление должно идти перед приведенной выше переписью в вашем .htaccess
файл:
# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]
Чтобы проверить часть строки запроса URL-адреса, вы должны использовать директиву RewriteCond
и проверить переменную сервера QUERY_STRING
( RewriteRule
шаблон совпадает только с частью URL-пути URL-адреса).
%1
и %2
являются обратными ссылками на захваченные группы в последнем сопоставленном шаблоне . т.е. \d+
и [\w-]+
соответственно. Это обратная сторона более ранней перезаписи.
?
в конце RewriteRule
замена требуется для удаления строки запроса из запроса. (В качестве альтернативы вы можете использовать флаг QSD
на Apache 2.4+)
ОБНОВЛЕНИЕ: Условие , которое проверяет переменную среды REDIRECT_STATUS
, гарантирует, что мы перенаправляем только первоначальный запрос, а не переписанный запрос более поздней директивой (см. Выше). REDIRECT_STATUS
env var не существует (т. Е. пусто) по первоначальному запросу и устанавливается только после первого внутреннего переписать/подзапрос. (В контексте для каждого каталога (например, .htaccess
) процесс перезаписи по существу начинается заново после последнего RewriteRule
и продолжается до тех пор, пока URL-адрес не пройдет без изменений. Флаг L
просто завершает "текущий проход" через процесс перезаписи, запуская процесс для эффективного запуска снова, используя теперь переписанный URL-адрес в качестве входных данных.)
Краткое описание
Объединив это, мы имеем:
Options -Multiviews
RewriteEngine On
# Canonical www to non-www redirect
RewriteCond %{HTTP_HOST} !^example\.com
RewriteRule (.*) http://exmaple.com/$1 [R=301,L]
# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]
# Rewrite /Category/10/some-text
RewriteRule ^Category/(\d+)/([\w-]+)$ Category.php?Category_Id=$1&Category_Title=$2 [L]
Мультивидения необходимо будет отключить (если это еще нет), чтобы этот конкретный пример работал.
Я думаю, что что-то подобное должно сработать.
RewriteEngine On
RewriteCond %{HTTP} off
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule ^Category.php?Category_Id=/(.*)$ /category/$1 [R=301,NC,L]
RewriteRule ^&Category_Title=/(.*)$ /$1 [R=301,NC,L]