.htaccess перезаписать поддомен в каталог

Ответы:

107

Попробуйте поместить это в свой файл .htaccess:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^sub.domain.com
RewriteRule ^(.*)$ /subdomains/sub/$1 [L,NC,QSA]

Для более общего правила (которое работает с любым поддоменом, а не только sub) замените последние две строки следующим:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ subdomains/%1/$1 [L,NC,QSA]
Ансари
источник
3
Решение Ansari будет работать, однако, когда я перейду на http://test.domain.com, URL-адрес перенаправит меня на http://test.domain.com/subdomains/test/. Можно ли без показа /subdomains/test/в конце?
Эрик Дьюпвик
2
В этом случае я считаю, что вам придется изучить использование mod_proxy и указать Pфлаг в дополнение к L.
Ansari
1
Нет, это перенаправляет http://test.domain.com/subdomains/test/, когда я хочу только показать,http://test.domain.com/
Эрик Дьюпвик
1
Я не вижу, как он перенаправляется test.domain.com/subdomains/test- может, здесь что-то еще происходит. Вы можете добавить RewriteBase /сразу после этого RewriteEngine on? Кроме того, если вы хотите, чтобы он отображался, test.domain.comвам придется использовать mod_proxy и [P]флаг.
Ansari
1
Мне удалось заставить его работать, используя ответ @anubhava здесь: stackoverflow.com/a/22395008/128984
Micah
50

Я не эксперт по mod_rewrite, я часто борюсь с этим, но я сделал это на одном из своих сайтов, в зависимости от ваших обстоятельств могут потребоваться другие флаги и т.д. Я использую это:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^subdomain\.example\.com$
RewriteCond %{REQUEST_URI} !^/subdomains/subdomain
RewriteRule ^(.*)$ /subdomains/subdomain/$1 [L] 

Любые другие правила перезаписи для остальной части сайта должны быть применены позже, чтобы они не мешали перезаписи вашего поддомена.

Ли Ковальковски
источник
Я бы так сказал. Я обнаружил, что этот параметр является правильным, как и мой ответ здесь .
Четабахана
5
В качестве справки, если кто-то из начинающих .htaccessзаходит на эту страницу (например, я), помимо создания фактического .htaccessфайла, чтобы он вступил в силу, вам необходимо установить AllowOverrideв своих VirtualHostнастройках ( stackoverflow.com/a/22819550/1657502 ) , включите rewriteмодуль Apache, а затем перезапустите Apache ( stackoverflow.com/a/5758551/1657502 )
Антонио Винисиус Менезес Медей
Это не сработает, если вы используете www для посещения субдомена. Решение @Minh будет работать во всех случаях.
Рохан Худе
@RohanKhude, вы имеете в виду, хотите ли вы, чтобы www.example.com и example.com обслуживали разный контент? Потому что обычно для SEO у вас есть www.example.com для перенаправления на example.com или наоборот.
Ли Ковальковски
1
@RohanKhude www в качестве субдомена субдомена - это тоже то, что вам тоже нужно заставить работать на уровне DNS, не так ли? Я думаю, что ваше ожидание, что он должен работать для любого произвольного поддомена, неверно. Ответ Минха ( stackoverflow.com/a/41389905/30945 ) предполагает, что ваша конфигурация .htaccess поддерживает 1 и только 1 поддомен, поэтому он менее надежен в этом аспекте. Мое решение поддерживает столько поддоменов, сколько вам нужно, но да, вам нужно явно определить каждый поддерживаемый поддомен, но дополнительный www.префикс, вероятно, лучше всего поддерживается с помощью перенаправления, чем перезаписи.
Ли Ковальковски
18

Вы можете использовать следующее правило в .htaccess, чтобы переписать поддомен в подпапку:

RewriteEngine On

 # If the host is "sub.domain.com"
 RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
 # Then rewrite any request to /folder
 RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]

Построчное объяснение:

  RewriteEngine on

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

  RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]

Эта строка является условием для RewriteRule, где мы сопоставляем HTTP-хост с использованием шаблона регулярного выражения. Условие говорит, что если хостом является sub.domain.com, выполните правило.

 RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]

Правило соответствует http://sub.domain.com/foo и внутренне перенаправляет его на http://sub.domain.com/folder/foo .

Замените sub.domain.com своим субдоменом, а папку - именем папки, на которую вы хотите указать свой субдомен.

Амит Верма
источник
1
Для меня это правильный ответ - объяснение того, как я сюда попал, следующее. Прибыл сюда в поисках давней проблемы с перенаправлением поддоменов, которая, по-видимому, сломалась, когда я установил SSL на TLD основного сайта. Первоначально перенаправление все еще пыталось использовать TLD основного сайта и нарушало правила безопасности. Что мне было нужно, так это сохранить поддомен (который находился в совершенно другом TLD) на том же хосте, но вдали от основного сайта. Добавление правила перезаписи, как указано выше, позволило мне перенаправить весь субдомен в папку, размещенную на основном сайте TLD.
Ричард Баун
8

У меня была такая же проблема, и я нашел подробное объяснение на http://www.webmasterworld.com/apache/3163397.htm

Мое решение (содержимое поддоменов должно находиться в папке с именем sd_subdomain:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} subdomain\.domain\.com
RewriteCond $1 !^sd_
RewriteRule (.*) /sd_subdomain/$1 [L]
Пабло Торресилья
источник
1
У меня не работает, надо что-то настраивать в днс зоне домена?
totoaussi 02
1
@totoaussi вы должны создать запись * A или запись A для каждого поддомена, указывающую на тот же сервер.
Пабло Торресилья
4

Это перенаправляет в ту же папку на поддомен:

.httaccess

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain\.com/subdomains/%1
jmsmarcelo
источник
3

Попробуйте поместить этот файл .htaccess в папку поддомена:

RewriteEngine On

RewriteRule ^(.*)?$ ./subdomains/sub/$1

Он перенаправляет на http://domain.com/subdomains/sub/ , когда вы хотите, чтобы он отображал только http://sub.domain.com/

Мин Трон
источник
Вопрос задан в 2012 году и имеет 8 ответов. Ваш ответ добавляет ценности на данном этапе?
ppovoski
Это решение будет работать, даже если вы используете www для посещения субдомена
Рохан Худе
2

Перенаправить каталог поддомена:

RewriteCond %{HTTP_HOST} ^([^.]+)\.(archive\.example\.com)$ [NC]
RewriteRule ^ http://%2/%1%{REQUEST_URI} [L,R=301]
Mayank Awasthi
источник
0

Для любого запроса субдомена используйте это:

RewriteEngine on 
RewriteCond %{HTTP_HOST} !^www\.band\.s\.co 
RewriteCond %{HTTP_HOST} ^(.*)\.band\.s\.co 
RewriteCond %{REQUEST_URI} !^/([a-zA-Z0-9-z\-]+) 
RewriteRule ^(.*)$ /%1/$1 [L] 

Просто сделайте какую-нибудь папку такой же, как и нужное вам субдомен. Папка должна быть EXIST как это: domain.com/sub для sub.domain.com .

Хафидж Хан
источник
У меня это работает, но не сохраняет файл. Например sub.domain.com/index.php throw 404
Паоло Фаломо,