Переписать .htaccess для перенаправления корневого URL в подкаталог - PullRequest
236 голосов
/ 13 июня 2009

пытаюсь получить

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]

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

Ответы [ 19 ]

5 голосов
/ 07 февраля 2017

Можно использовать Redirect тоже для этой цели

Redirect 301 / www.example.com/store

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

Alias / /store

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

Refrences

4 голосов
/ 16 февраля 2016

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

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

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

3 голосов
/ 13 июня 2009

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

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

Два способа решения этой проблемы: 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 голос
/ 14 февраля 2013

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

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

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

RewriteEngine

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

0 голосов
/ 26 марта 2018

Это попытается использовать 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 голосов
/ 21 марта 2018

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

What am I doing wrong?

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

0 голосов
/ 22 августа 2017

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