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

htaccess 301 перенаправление из каталога в файл

Я унаследовал сайт ( бюллетень forum) и перенёс его с другого хостинга на мой, скопировав всё с scp команда. В корневом каталоге было следующее .htaccess

RewriteOptions inherit

RewriteEngine on
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^/?$ "http\:\/\/example\.com\/forums\/content\/" [R=301,L]

Я не знаю, как это должно было работать, но это сработало, несмотря на то, что /forums/content/ папка НЕ ​​существует. Однако после переезда на мой хостинг он перестал работать, выдав ошибку 404. Поскольку /forums/content.php файл существует, я отредактировал .htaccess как это:

RewriteOptions inherit

RewriteEngine on
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^/?$ "http\:\/\/example\.com\/forums\/content.php" [R=301,L]

Теперь он работает с ошибкой: мой браузер (и все остальные браузеры пользователей форума) кэширует предыдущее перенаправление 301, поэтому я могу подключиться к форуму и использовать его только в том случае, если я очищу кеш браузера (один раз) или введу content.php URL вручную (каждый раз).

Я пробовал обходной путь, чтобы добавить перенаправление с /forums/content/ к /forums/content.php, добавив RewriteRule к .htaccess:

RewriteOptions inherit

RewriteEngine on
RewriteCond %{HTTP_HOST} ^.*$
RewriteRule ^/forums/content/$ "http\:\/\/example\.com\/forums\/content.php" [R=301,L]
RewriteRule ^/?$ "http\:\/\/example\.com\/forums\/content.php" [R=301,L]

Однако кажется, что правило игнорируется, потому что браузер по-прежнему получает ошибку 404 на /forums/content/ каталог, и он не перенаправляет на content.php. Что я делаю не так?

Как уже упоминалось в комментариях, когда mod_rewrite используется в каждом каталоге .htaccess файлов, в URL-пути, который соответствует RewriteRule шаблон. Префикс каталога (который всегда заканчивается косой чертой) сначала удаляется.

Однако ваши директивы также расположены в неправильном порядке и могут быть исправлены. В RewriteCond директива применяется к одиночному RewriteRule что следует. Вы вставили RewriteRule между этими директивами, поэтому вы эффективно изменили логику. Но эти двое RewriteRule директивы могут быть легко объединены, и что RewriteCond директива выглядит лишней.

Если вам специально не нужен RewriteOptions директиву, я бы ее удалил. Это могло потребоваться на предыдущем хосте.

Вместо этого попробуйте следующее:

RewriteEngine on
RewriteRule ^(forums/content/)?$ http://example.com/forums/content.php [R=301,L]

В шаблон ^(forums/content/)?$ соответствует либо /forums/content/ или просто /, что и есть оригинал RewriteRule соответствовал.

Я удалил RewriteCond директива, которая проверяется на соответствие HTTP_HOST. Я предполагаю, что это должно было совпадать что-то (т.е. не ничего). Однако он просто соответствовал что-нибудь которые бы всегда быть правдой, что кажется немного бессмысленным.

Нет необходимости в экранировании всех обратных косых черт в RewriteRule замена. Это обычная строка, а не регулярное выражение. (Такое ненужное экранирование типично для cPanel.)

ОБНОВИТЬ: Вам необходимо убедиться, что MultiViews не включен. Это можно отключить с помощью Options директива в верхней части вашего .htaccess файл:

Options -MultiViews

Если у вас уже есть Options директивы, то это можно комбинировать, например:

Options -MultiViews +FollowSymLinks

поскольку /forums является физическим каталогом, если MultiViews включен, это может привести к тому, что mod_negotiation сделает внутренний запрос для content.php (или даже что-то еще, например content.html если он существует) до того, как mod_rewrite сможет инициировать перенаправление.