.htaccess Redirect 301 с завершающей косой чертой добавляет конечную косую черту к месту назначения

Мой веб-сайт только что переделал, и я пытаюсь настроить перенаправления в файле .htaccess для ссылок, которые изменились

Это работает нормально, за исключением того, что не работает для / example / (с завершающей косой чертой на исходном пути)

Redirect 301 /example /example.php

Поэтому я добавил это, чтобы учесть конечную косую черту:

Redirect 301 /example/ /example.php

Но это перенаправляет на example.php / (добавляет завершающую косую черту к месту назначения, что не работает)

Ясно, что я делаю это неправильно. Что лучше?

3
задан 12 October 2020 в 04:30
1 ответ

Но это перенаправляет на 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.

6
ответ дан 12 October 2020 в 01:21

Теги

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