Назад | Перейти на главную страницу

Как переписать пользователя с непереписанного url на перезаписанный url

У меня два URL-адреса. Один выглядит так (это непереписанный URL):

  1. www.example.com/article.php?id=12

А следующий выглядит так (это переписанный URL):

  1. www.example.com/article/12

Оба URL-адреса работают. Я хочу знать, если пользователь посещает первый URL-адрес, может ли он быть автоматически перенаправлен на второй URL-адрес? Как я могу этого добиться? Есть ли способ сделать то же самое, только используя .htaccess файл?

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

www.example.com/article.php?id=12&title=sometitle

И ожидаемый красивый URL-адрес выглядит следующим образом

www.example.com/article/12/sometitle

Правило перенаправления, которое я использую, выглядит так

RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=302,L]

Я не хочу, чтобы пользователи видели уродливый URL, даже если он тоже посещает уродливый.

С подобными перенаправлениями вам нужно быть особенно осторожными с циклами перенаправления, поскольку вы уже внутреннее переписывание наоборот (от /article/12 к /article.php?id=12). Чтобы избежать цикла перенаправления, вы можете проверить URL-адрес на THE_REQUEST переменная сервера, которая содержит начальный заголовок запроса и не изменяется при перезаписи URL-адреса.

Итак, вы можете сделать что-то вроде следующего в верхней части вашего .htaccess файл, перед внутренние перезаписи.

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([\w-]+)\.php\?id=(\d+)\ HTTP
RewriteRule ^[\w-]+\.php$ /%1/%2? [R=302,L]

(Изменить 302 (временно) в 301 (постоянное) перенаправление, если вы уверены, что он работает нормально. 301 кешируются браузером, поэтому тестирование может быть проблематичным. В качестве альтернативы убедитесь, что вы тестируете с отключенным кешированием браузера.)

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

В RewriteRule шаблон это просто быстрая проверка, чтобы убедиться, что мы обрабатываем только те URL-адреса, которые выглядят как те, которые мы хотим настроить. Обратные ссылки %1 и %2 вернуться к CondPattern.

Шаблон [\w-]+ соответствует "названиям" статей, которые содержат слово персонажи a-z, A-Z, 0-9, _ и -. Если названия статей только строчные a-z затем измените этот шаблон на [a-z]+. Лучше быть более строгим с регулярным выражением.

Точно так же \d+ соответствует любому количеству цифр (0-9).

ОБНОВЛЕНИЕ №1: Казалось бы (из комментариев), что «статья» - это буквальное слово, а не слово, представляющее любой статья. В этом случае указанные выше директивы можно упростить:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)\ HTTP
RewriteRule ^article\.php$ /%1/%2? [R=302,L]

ОБНОВЛЕНИЕ №2: Чтобы включить «заголовок», вы можете просто расширить приведенный выше пример (хотя я не уверен, зачем вам это нужно). Итак, для перенаправления с /article.php?id=12&title=some-title к /article/12/some-title, вы можете сделать что-то вроде:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [R=302,L]