Мой веб-сайт только что переделал, и я пытаюсь настроить перенаправления в файле .htaccess для ссылок, которые изменились
Это работает нормально, за исключением того, что не работает для / example /
(с завершающей косой чертой на исходном пути)
Redirect 301 /example /example.php
Поэтому я добавил это, чтобы учесть конечную косую черту:
Redirect 301 /example/ /example.php
Но это перенаправляет на example.php /
(добавляет завершающую косую черту к месту назначения, что не работает)
Ясно, что я делаю это неправильно. Что лучше?
Но это перенаправляет на
example.php/
Это вызвано первым (исходным) правилом. Обратите внимание, что более ранний (ошибочный) 301, скорее всего, был кэширован браузером. Протестируйте с 302 (временной) переадресацией, чтобы избежать потенциальных проблем с кэшированием.
Директива Redirect
соответствует префиксу (целые сегменты пути), и все после совпадения добавляется в конец целевого URL. Итак, первая директива перенаправляет:
/example
на /example.php
/example/
на /example.php/
и /example /abc
to /example.php/abc
Если директивы упорядочены таким образом, они должны «работать» для двух опубликованных примеров URL:
Redirect 301 /example/ /example.php
Redirect 301 /example /example.php
Однако Redirect
Директива ] на самом деле не является правильной директивой для использования здесь, так как вам нужны две директивы для обработки этого. (Как правило, с директивой Redirect
вам необходимо либо включить, либо исключить косую черту в конце как исходного, так и целевого URL.)
Вы можете использовать RedirectMatch вместо этого директива
, которая соответствует использованию регулярного выражения. Например, для обработки как с косой чертой, так и без нее:
RedirectMatch 301 ^/example/?$ /example.php
Это соответствует только /example
или /example/
и перенаправляет на /example.php
. .
Redirect
и RedirectMatch
являются частью mod_alias.
Однако, если вы уже используете mod_rewrite, рассмотрите возможность использования mod_rewrite RewriteRule
, чтобы избежать потенциальных конфликтов, поскольку mod_rewrite всегда запускается перед mod_alias, несмотря на очевидный порядок директив в .htaccess
. Например:
RewriteEngine On
RewriteRule ^example/?$ /example.php [R=301,L]
Обратите внимание, что в RewriteRule
шаблоне нет префикса косой черты при использовании в .htaccess
, поскольку URL-путь, который шаблон соответствует удаленному префиксу каталога (который всегда оканчивается косой чертой).
Обратите внимание, что порядок директив внутри каждого модуля может быть важен.
Кроме того: Если ваш веб-сайт был «переделан», почему «новые» URL-адреса имеют вид /example.php
? Это может показаться отсталым?
ОБНОВЛЕНИЕ: Кто-то преобразовал исходный веб-сайт WordPress в (почти) эквивалентный сайт, который использовал только HTML и немного javascript и php
Вы потенциально могли бы сохранить исходный WordPress URL-адреса (например, /example
) и внутренне переписывают запрос в базовый файл, который обрабатывает запрос (например, example.php
) вместо внешнее перенаправление. Для этого вам нужно будет использовать mod_rewrite. Вам также необходимо ссылаться на «старые» URL-адреса WordPress в исходном HTML-коде. например. /example
(и рассмотрите возможность канонизации косой черты в конце — перенаправление на одно или другое).
Чтобы внутренне переписать /example
(или /example/
) в /example.php
, вам просто нужно удалить R
из приведенной выше директивы RewriteRule
. Например:
RewriteRule ^example/?$ example.php [L]
(Я также удалил косую черту в замене RewriteRule
, которая теперь не требуется, так как мы перезаписываем путь в файловой системе.)
Предоставление вам ссылки на /example
в исходном коде HTML, пользователь не знает, что запрос действительно сопоставлен с example.php
.