Перенаправление htaccess 301 из каталога в файл
Я унаследовал сайт (форум vbulletin) и перенес его с другого хостинга на мой, скопировав все с 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
, Что я делаю неправильно?
1 ответ
Как уже упоминалось в комментариях, когда в каждом каталоге используется 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 сможет инициировать перенаправление.