it-roy-ru.com

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

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

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]

Что я делаю неправильно?

226
AlphaSmith

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

RewriteEngine On
RewriteRule ^$ /store [L]
255
Sander

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

RedirectMatch ^/$ /store/

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

122
Dio Phung

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

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]
104
Gumbo

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

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 со своими значениями. 

75
Jage

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

RewriteEngine on

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

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

в

А также

в

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

21
starkeen

Другой вариант, если вы хотите переписать 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-адрес.

20
gaborous

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

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

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

13
user1801050

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

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

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/*
8
inf3rno

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

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

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

В моем случае при посещении www.example.com я хотел перенаправиться в подкаталог / store, но не обновляя 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

5
Mahmoud Zalt

Для этого можно использовать Redirect

Redirect 301 / www.example.com/store

Или Псевдоним для отображения

Alias / /store

Edit: mod_alias применимо только в httpd.conf.

Refrences

4
Abhishek Gurjar

Ранее я использовал следующий код, который работает правильно, чтобы перенаправить корневой 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 и т.д.), Код остается действительным.

4
Chetabahana

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

  • первая строка совпадает на хосте, начиная с строго 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]
3
Artem Russakovskii

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

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

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

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

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

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

3
Steven

Два возможных пути решения этой проблемы: 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
Mushtaq Hussain

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

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

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

RewriteEngine

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

1
Abouasy

Это попытается использовать subdir, если файл не существует в корне. Нужно было это, когда я переместил базовый .html-сайт, который, как ожидается, будет запущен на корневом уровне, и перенес его в подкаталог. Работает только в том случае, если все файлы плоские (никакой хитрости .htaccess в поддире нет). Полезно для связанных вещей, таких как файлы 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]
0
mikeytown2

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

What am I doing wrong?

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

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
karthikeyan ganesan