.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]

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

Ответ 1

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

RewriteEngine On
RewriteRule ^$ /store [L]

Ответ 2

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

RedirectMatch ^/$ /store/

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

Ответ 3

Попробуйте следующее:

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

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

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

Ответ 5

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

Ответ 6

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

RewriteEngine on

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

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

к

и

к

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

Ответ 7

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

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

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

Ответ 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/*

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

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

Ответ 13

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

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

Ответ 14

Немного googling, дает мне следующие результаты:

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, поэтому я не уверен, что это сработает.

Ответ 15

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

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

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

RewriteEngine

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

Ответ 16

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

Ответ 17

вы просто добавляете этот код в свой .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>

Ответ 18

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

What am I doing wrong?

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

Ответ 19

Это попробует 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]