У меня два URL-адреса. Один выглядит так (это непереписанный URL):
www.example.com/article.php?id=12
А следующий выглядит так (это переписанный URL):
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]