Переписать .htaccess для перенаправления корневого URL в подкаталог


246

Пытаясь получить

www.example.com

идти прямо к

www.example.com/store

Я пробовал несколько битов кода, и ни один не работает.

Что я пробовал:

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^(.+)\www.example\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

Что я делаю не так?

Ответы:


275

Вы можете использовать правило перезаписи, которое использует ^ $ для представления корня и переписать его в каталог / store, например так:

RewriteEngine On
RewriteRule ^$ /store [L]

6
RewriteRule ^ /? $ /Index.do [R]
barclay

2
^ / $ никогда не совпадает, поэтому я думаю, что ^ /? $ не обязательно.
NateS

Можно ли тогда показать полный URL и продолжить обработку правил? В моем случае я переписываю некоторые URL, чтобы они были красивыми. Это сохраняет URL example.com - я хотел бы example.com/store, а затем продолжить с другими переписывает.
gin93r

У меня тоже отлично работает.
Джитеш Соджитра

1
Совсем недавно я потратил много времени на отладку, почему это не работает на сайте в Ubuntu Apache 2.4.7. Отладка перезаписи показала, что правило попало и генерирует ВНУТРЕННЕЕ НАПРАВЛЕНИЕ. Тогда, казалось, просто припарковать это и искать страницу индекса. Оказывается, что если mod_dir включен И в каталоге dir есть кандидат на индексную страницу, он переопределяет mod_rewrite, ЕСЛИ ВЫ не установили: DirectoryCheckHandler On
Gerrit

144

Я был удивлен, что никто не упомянул это:

RedirectMatch ^/$ /store/

По сути, он перенаправляет корневой и только корневой URL. Ответ возник по этой ссылке


3
спасибо, это отлично сработало для меня с уже существующим правилом. нет конфликта
ученый

1
Этот работает отлично. Кроме того, он охватывает как http, так и https.
Саим Шафайет

3
И это для 301 перенаправления:RedirectMatch 301 ^/$ /store/
Андреа

Да, это проще, чем с переписать. Спасибо!
Орден

2
@Andrea А это для 302 временного перенаправления: RedirectMatch 302 ^ / $ / store /
Файзан Анвер Али Рупани,

108

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

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteRule ^$ store [L]

Если вы хотите внешнее перенаправление (которое приводит к тому, что посещающий браузер показывает перенаправленный URL-адрес), установите Rфлаг также там:

RewriteRule ^$ /store [L,R=301]

4
Это работало прекрасно. Как sample.com, так и www.sample.com перенаправляют на www.sample.com/store. Это именно то, что я хотел. Спасибо, Гамбо, и всем, кто ответил. Я многому научился, читая ваши ответы и ценю отзывы.

1
Мне интересно, будет ли это показываться www.example.comкак URI после перенаправления? Если нет, как бы это изменить?
stefmikhail

1
♦ - И почему ваше решение будет лучше, чем Сандер внизу? Я замечаю, что ваша последняя строка такая же, но если это все, что нужно, зачем включать RewriteCondи первое RewriteRule?
stefmikhail

Если этот код используется, вы можете ввести в браузере exmple.com/../aboveSubDir?

@GamErix Это может быть решено /aboveSubDirлибо браузером, либо сервером.
Гамбо

79

Вот что я использовал для перенаправления в подкаталог. Это делало это незаметно и до сих пор позволяет проходить запросы, которые соответствуют существующему файлу или чему-либо еще.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteCond %{REQUEST_URI} !^/subdir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subdir/$1
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteRule ^(/)?$ subdir/index.php [L]

Измените site.com и subdir со своими значениями.


Работает как положено! Большой!
Качар

домашняя страница была "невидимой" ... но как только я нажму на ссылку, имя субдиректора появится в адресной строке ... есть ли способ предотвратить отображение имени субдиректора?
dsdsdsdsd

4
только делает root - не делает подкаталоги
php-b-grader

3
Для меня это дает "Внутренняя ошибка сервера": /
Pithikos

1
Большое вам спасибо, вы не знаете, как долго я искал именно это.
Base Desire

27

Чтобы установить невидимое перенаправление из корневой папки в подпапку, вы можете использовать следующую RewriteRule в /root/.htaccess:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/subfolder
RewriteRule ^(.*)$ /subfolder/$1 [NC,L]

Приведенное выше правило внутренне перенаправляет браузер из:

в

И

в

пока браузер останется в корневой папке.


1
Это должен быть принятый ответ ... RewriteRule (как предложено в некоторых других ответах) вызывает бесконечное перенаправление, так как / subfolder перенаправляется в / subfolder / subfolder и т. Д ... RewriteCond% {REQUEST_URI}! ^ / Subfolder удостоверится, что если URL уже перенаправлен, это не будет сделано снова
Патрик

21

Другой вариант, если вы хотите переписать URL и скрыть оригинальный URL:

RewriteEngine on
RewriteRule ^(.*)$ /store/$1 [L]

При этом, если вы, например, наберете текст http://www.example.com/product.php?id=4, он будет прозрачно открывать файл, http://www.example.com/store/product.php?id=4но не показывать пользователю полный URL-адрес.


2
Добавьте QSA(строка запроса append) в [L]( [L, QSA]), если вы хотите перенести строки запроса в переписанный URL.
devios1

Спасибо @chaiguy за подсказку, но на моем сервере это работало без QSA (но я согласен, что лучше добавить QSA). Может быть, это из-за какой-то особой конфигурации моего сервера apache?
Габорист

1
Этот метод для меня, example.com, показывает контент из example.com/store прозрачно, но example.com/test перенаправляет на example.com/store/test, показывая URL
Джеффри Хейл

14

Это казалось самым простым решением:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]

Я получал петли перенаправления с некоторыми другими решениями.


2
этот не скрывает каталог
php-b-grader

8

Я не понимаю твой вопрос ...

Если вы хотите перенаправить каждый запрос в подпапку:

RewriteRule ^(.*)$ shop/$1 [L,QSA]

http://www.example.com/* -> wwwroot/store/*

Если вы хотите перенаправить в подпапку с именем домена

RewriteCond %{HTTP_HOST} ([^\.]+\.[^\.]+)$
RewriteRule ^(.*)$ %1/$1 [L,QSA]

http://www.example.com/* -> wwwroot/example.com/*

Мне нравится ваш код, ([^\.]+\.[^\.]+)$чтобы зарезервировать домен в качестве имени подпапки.
Четабахана

7

Большинство из приведенных выше решений являются правильными, но им не хватает прозрачности перенаправления.

В моем случае при посещении www.example.com я хотел получить перенаправление в подкаталог / магазин, но без обновления URL-адреса до www.example.com/store . (все, что я хочу, это получить код страницы из этого каталога). Если это ваш случай, решение ниже работает отлично.

RewriteEngine on
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ /store/$1 [L]

источник: http://wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory


Что я должен изменить, если мне нужно, чтобы www.example.com был перенаправлен на www.othersite.com/store без обновления URL? Я пытался, но не смог адаптировать ваш код
шаги

Я пытался изменить последнюю строку на, RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]но он обновляет URL
шаги

Все, что вам нужно, это заменить слова exampleи store.
Махмуд Зальт

Я не очень хорошо объяснил. Я владею example.comи otherpage.comдоменами. Когда я захожу, example.comя хочу, чтобы содержимое otherpage.com/subfolderотображалось без обновления URL
шаги с

Ну мой ответ выше не делает этого. Попробуйте опубликовать новый вопрос.
Махмуд Залт,

6

Я обнаружил, что во избежание циклического перенаправления важно ограничить область перенаправления корневым каталогом. Я бы использовал:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]


4

Раньше я использовал следующий код, который работает правильно, чтобы перенаправить корневой URL каждого из моих доменов / поддоменов в их подкаталоги корреспонденции, которые названы точно так же, как и сам подкаталог, как показано ниже:

RewriteCond %{HTTP_HOST} ^sub1.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain1.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub1.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub2.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Однако, когда я хочу добавить другие подпрограммы или домены, это необходимо будет добавить в приведенный выше код. Было бы гораздо удобнее упростить его для работы как подстановочный знак (*), как показано ниже:

RewriteCond %{HTTP_HOST} ^sub
RewriteCond %{REQUEST_URI} !/subs/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Таким образом, всякий раз, когда добавляются другие субдомены / домены, если имя субдомена имеет префикс sub (например, sub3.domain1.com, sub1.domain3.com и т. Д.), Код остается действительным.


3

Я думаю, что основные проблемы с кодом, который вы разместили:

  • первая строка совпадает на хосте, начинающемся со строго sample.com, поэтому www.sample.com не совпадает.

  • вторая строка требует как минимум одного символа, за которым следует www.sample.com, который также не соответствует (почему вы избежали первого w?)

  • ни одно из включенных правил не перенаправляет на URL, который вы указали в своей цели (плюс, выборка написана с ошибкой как samle, но это не имеет значения).

Для справки вот код, который у вас есть:

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^sample.com$
RewriteRule (.*) http://www.sample.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^(.+)\www.sample\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

2

Немного погуглив, дает мне такие результаты:

RewriteEngine On
RewriteBase /
RewriteRule ^ index. (. *)? $ Http://domain.com/subfolder/ [r = 301]

Это перенаправит любую попытку доступа к файлу с именем index.something в вашу подпапку, независимо от того, существует файл или нет.

Или попробуйте это:

RewriteCond% {HTTP_HOST}! ^ Www.sample.com $ [NC]
RewriteRule ^ (. *) $% {HTTP_HOST} / samlse / $ 1 [R = 301, L]

Я не сделал много перенаправления в файле .htaccess, поэтому я не уверен, будет ли это работать.


2

Существует два способа решения этой проблемы: 1. Создайте .htaccessфайл в корневой папке, как показано ниже (просто замените example.com и my_dir соответствующими значениями):

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/my_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_dir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ my_dir/index.php [L] 
</IfModule>
  1. Используйте RedirectMatch только для перенаправления корневого URL «/» в другую папку или URL,

    RedirectMatch ^ / $ http://www.example.com/my_dir


1

попробуйте использовать ниже строки в htaccess

Примечание: вам может понадобиться проверить, как называется default.html.

default.html - это файл, который по умолчанию загружается в корневую папку.

RewriteEngine

Redirect /default.html http://example.com/store/


0

вы просто добавляете этот код в ваш файл .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /folder/index.php [L]
</IfModule>

0

Я отвечу на исходный вопрос не указав другой возможный синтаксис (среди прочих есть множество), а указав на то, с чем мне когда-то приходилось иметь дело, и мне потребовалось некоторое время, чтобы выяснить:

What am I doing wrong?

Существует вероятность того, что% {HTTP_HOST} заполнен неправильно или не заполнен вообще. Хотя я только видел, что это происходит только на одной машине на общем хосте, с некоторым патчем apache 2.2, но это возможно.


0

Это попытается использовать subdir, если файл не существует в корне. Нужно было это, когда я переместил базовый .html-сайт, который, как ожидается, будет запущен на корневом уровне, и перенес его в подкаталог. Работает только в том случае, если все файлы плоские (нет возможности хитрости .htaccess в subdir). Полезно для связанных вещей, таких как файлы CSS и JS.

# Internal Redirect to subdir if file is found there.
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/subdir/%{REQUEST_URI} -s
RewriteRule ^(.*)$ /subdir/$1 [L]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.