Перенаправление с URL с параметрами в URL-адрес дружественного SEO в .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, но не перенаправляю страницу на дружественный URL

Options -Multiviews
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^exmaple\.com$
RewriteRule ^(.*) http://exmaple.com/$1 [R=301,L]

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

3 голоса | спросил Mohammadreza 19 J0000006Europe/Moscow 2017, 20:31:24

2 ответа


3

TL; др

# Redirect /Category.php?Category_Id=10$Category_Title=some-text
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)$Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

  

я изменил сгенерированную ссылку от плохой структуры seo до дружественной структуры и работает

Достаточно честный, рад, что вы его отсортировали, я полагаю, вы используете какую-то CMS? (Возможно, это добавил что-то к вашему .htaccess, я бы подумал?)

В любом случае, чтобы ответить на ваш первоначальный вопрос (ы) ...

  

Я: Вы уже изменили URL-адрес приложения в «симпатичном» формате? например. URL, который пользователь видит на странице, это example.com/Category/10/some-text, not example.com/Category.php?Category_Id=10&Category_Title=some-‌text

     

Вы: да. но это очень много. Мне нужно сделать все URL-адрес довольно на всех страницах, и я делаю это сейчас. Но я хочу знать, есть ли решение htaccess, которое я делаю it.so вы говорите, что изменение url на всех страницах является единственным решением ...

В то время как технически возможно реализовать это только в .htaccess, не изменяя при этом URL-адреса в вашем приложении, это не рекомендуется. Это обеспечит плохой пользовательский интерфейс и потенциально может повредить SEO вашего сайта.

Если вы не изменили URL-адрес в своем приложении, то каждый раз, когда пользователь нажимает на внутреннюю ссылку, у них будет внешний перенаправление (второй запрос) на канонический URL-адрес (до тех пор, пока переадресация не будет кеширована). Это дополнительный (ненужный) запрос на вашем сервере. Старый URL-адрес будет доступен пользователю и скопирован (например, «Копировать адрес ссылки»).

Как правило, единственная причина для реализации такого перенаправления заключается в том, что старые URL-адреса уже были связаны с и /или поисковыми системами уже проиндексировали старую структуру URL. Затем требуется перенаправление, чтобы сохранить SEO.

Внутренний переписать (новый «симпатичный» 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 %{QUERY_STRING} ^Category_Id=(\d+)$Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

Чтобы проверить строку запроса в URL-адресе, вы должны использовать директиву RewriteCond и проверить на серверную переменную QUERY_STRING ( RewriteRule pattern соответствует только URL-адресу URL-адреса URL-адреса).

%1 и %2 являются обратными ссылками для захваченных групп в последнем сопоставленном CondPattern . то есть. \d+ и [\w-]+ соответственно. Это противоположность предыдущей перезаписи.

? в конце RewriteRule подстановка требуется для удаления строки запроса из запроса. (В качестве альтернативы вы можете использовать флаг QSD на Apache 2.4 +)

Резюме

Объединяя это, мы имеем:

Options -Multiviews
RewriteEngine On

# Canonical www to non-www redirect
RewriteCond %{HTTP_HOST} !^exmaple\.com
RewriteRule (.*) http://exmaple.com/$1 [R=301,L]

# Redirect /Category.php?Category_Id=10$Category_Title=some-text
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]
ответил MrWhite 20 J0000006Europe/Moscow 2017, 19:23:55
-1

Я думаю, что что-то вроде этого должно работать.

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]
ответил norcal johnny 20 J0000006Europe/Moscow 2017, 08:44:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132