Перенаправление с 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]

Как я могу это сделать?

Author: MrWhite, 2017-06-19

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]

Мультивидения необходимо будет отключить (если это еще нет), чтобы этот конкретный пример работал.

 4
Author: MrWhite, 2020-06-16 10:32:57

Я думаю, что что-то подобное должно сработать.

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]
 -1
Author: norcal johnny, 2017-06-20 05:44:37