.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

Добре працює і для мене.
Jitesh Sojitra

1
Нещодавно я витратив чимало часу на налагодження, чому це не працює на сайті в Ubuntu Apache 2.4.7. Перезапис налагодження показав, що правило потрапляє та генерує ВНУТРІШНЕ ПЕРЕДАЧ. Тоді здавалося, що це просто припаркувати і шукати індексну сторінку. Виявляється, що якщо модуль mod_dir увімкнено І в реєстрі є кандидат на сторінці індексу, він переосмислює mod_rewrite, ПІДНЯТЬ ви встановлюєте: DirectoryCheckHandler On
Gerrit

142

Я був здивований, що про це ніхто не згадував:

RedirectMatch ^/$ /store/

В основному, він перенаправляє кореневу та лише кореневу URL-адресу. Відповідь виникла за цим посиланням


3
дякую, для мене це спрацювало чудово з уже існуючим правилом. ніякого конфлікту.
вчений

1
Цей ідеально працює. Також він охоплює як http, так і https.
Саєм Шафает

3
І це для переадресації 301:RedirectMatch 301 ^/$ /store/
Андреа

Так, простіше, ніж переписувати. Дякую!
Орден

2
@Andrea І це для тимчасового переадресації 302: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani

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. Це саме те, що я хотів. Дякую Gumbo, і всі, хто відповів. Я багато чого навчився читати ваші відповіді та ціную відгуки.

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]

Змініть сайт.com і додайте до своїх значень значення.


Працює як очікувалося! Чудово!
качар

домашня сторінка була "прихованою" ... але як тільки я натискаю на посилання, в адресному рядку з'являється ім'я субдір ... чи існує спосіб запобігти появі імені субдір?
dsdsdsdsd

4
тільки root - не робить підкаталоги
php-b-greder

3
Для мене це дає "Внутрішня помилка сервера": /
Pithikos

1
Дякую вам велике, ви не знаєте, як довго я саме це шукав.
База Бажання

26

Щоб встановити невидимий переспрямування з кореня на підпапку, ви можете використовувати такі RewriteRule в /root/.htaccess:

RewriteEngine on

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

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

до

І

до

а браузер залишиться в кореневій папці.


1
Це має бути прийнятою відповіддю ... RewriteRule разом (як це пропонується в деяких інших відповідях) викликає нескінченне переспрямування, оскільки / підпапка переспрямована в / підпапка / підпапка тощо ... RewriteCond% {REQUEST_URI}! ^ / Підпапка гарантує, що якщо 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(рядок додавання запиту) до [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-greder

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

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

6

Я виявив, що для уникнення кругового перенаправлення важливо обмежити область переадресації кореневою директорією. Я б використав:

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

6

Більшість вищезазначених рішень є правильними, але всі вони не мають прозорості перенаправлення.

У моєму випадку, відвідуючи 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
кроки

Ну моя відповідь вище цього не робить. Спробуйте опублікувати нове запитання.
Махмуд Зальт


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]

Однак, коли я хочу додати ще інші підсобки або домени, тоді це потрібно буде додати у вказаний вище код. Це має бути набагато зручніше спростити його для роботи як wildcard (*), як показано нижче:

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, який також не відповідає (чому ти врятувався першим ш?)

  • жодне із включених правил не переспрямовує на URL, який ви вказали у своїй цілі (плюс, зразок неправильно написано як вибірку, але це не має значення).

Для довідки, ось код у вас є:

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

Трохи гугле, дає мені такі результати:

Перепишіть на індекс
RewriteBase /
RewriteRule ^. (. *)? $ 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} не заповнюється належним чином, або взагалі. Хоча я бачив лише те, що трапляється лише на одній машині на спільному хості, з деякими спеціально закріпленими апашами 2.2, проте це є можливою.


0

Це спробує підкаталог, якщо файл не існує в корені. Це було потрібно, коли я перемістив базовий .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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.