.htaccess: перенаправить корневой URL-адрес в подкаталог, но сохранить корневой URL-адрес

Я нахожусь в процессе очистки структуры каталогов моего домена (горе мне за настройку содержимого корневого URL в корневом каталоге!) И мне нужно немного узнать о том, как правильно использовать RewriteRule.

Суть

Я хочу, чтобы domain.tld использовал domain.tld / subdirectory /, но по-прежнему отображается как domain.tld в URL.

Мой.htaccess Пока

Options +FollowSymlinks
RewriteEngine On

#Force removal of wwww subdomain
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.domain.tld
RewriteRule ^(.*)$ http://domain.tld/$1 [R=301,L]

#Trailing slash
RewriteRule ^/*(.+/)?([^.]*[^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]

#Redirect root url to subdirectory
RedirectMatch 301 ^/subdirectory/$ http://domain.tld/
RewriteRule ^/$ /subdirectory/?$ [L]

RedirectMatch прекрасно работает. К сожалению, кажется, что последний RewriteRule должен работать достаточно просто, но это не так. Старая настройка содержимого в корневом каталоге по-прежнему отображается.

Что мне здесь не хватает?

Обновление: решено

Простое исправление: я не достаточно опытен с.htaccess / apache, чтобы объяснить, почему.

Я имел:

RewriteRule ^/$ /subdirectory/?$ [L]

Удаление одной косой черты исправило все:

RewriteRule ^$ /subdirectory/?$ [L]

Итак, теперь мой вопрос: почему это так?

4 ответа

Попробуй это:

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} !^/subdirectory/

# REWRITES ALL URLS 
# [REPLACE "domain" WITH THE ACTUAL DOMAIN, 
# WITHOUT THE TLD (.com, .net, .biz, etc)]
RewriteCond %{HTTP_HOST} ^(www\.)?domain\.

# REWRITE ALL THOSE TO subdirectory
RewriteRule ^(.*)$ /subdirectory/$1 [L]

БР Спирос

Часть URI в RewriteRule не содержит предшествующий слеш

Чтобы соответствовать http://example.com/ ты должен использовать RewriteRule ^$ где RewriteRule ^/$ будет теоретически соответствовать http://example.com// (обратите внимание на двойную косую черту).

Дополнительно: ?$ в конце не имеет никакого смысла, так как это добавит строку запроса с пустым параметром $,

Наконец у вас есть: RewriteRule ^$ /subdirectory/ [L,QSA]

Оба правила действительны:

Этот будет использоваться в конфигурации сервера или в контексте виртуального хоста (URL начинается с косой черты):

RewriteRule ^/$ /subdirectory/ [L]

Если вы поместите то же правило в .htaccess, то вы должны удалить начальную косую черту (потому что это относительно текущей папки):

RewriteRule ^$ /subdirectory/ [L]

PS Флёрн уже упоминал о ?$ это целевая часть URL. Нет необходимости $ совсем. Если вы закончите свой URL с ? это говорит Apache не переносить строку запроса на новый URL (полностью удалить строку запроса).

Дополнительно, [QSA] Флаг требуется только если вы манипулируете строкой запроса (есть ? в целевом URL) и все еще хотел бы, чтобы ваша текущая строка запроса была добавлена ​​к вновь созданному URL. Это означает, что в этом правиле RewriteRule ^$ /subdirectory/ [L,QSA] [QSA] Флаг вообще ничего не делает и может быть безопасно удален.

Я попробовал решение, но в моем случае удаляет /folder/ НО, показывая старый сайт (www.site.it), а не www.site.it/folder/ с удаленной "папкой"... Я скопировал и вставил то же самое код, но не работает в моем случае:(я открыл новую тему: .htaccess: перенаправить корневой URL WordPress на другой WordPress в подкаталоге, но сохранить корневой URL

Другие вопросы по тегам