LINUX.ORG.RU

Выражение в .htaccess для Mod_Rewrite


0

0
Приветствую.

Подскажите пожалуйста правильные выражения для создания автоматических субдоменов.
Принцип такой:

domain.com/
|--site1/
|  |----index.html
|--site2/
|  |----index.html
|--index.html

То есть, существует domain.com. Хочется сделать так, чтобы, создавая каталоги внутри него, они автоматически становились бы поддоменами. То есть, чтобы можно было зайти как на http://(www.)domain.com/site1 и http://(www.)domain.com/site2, так и на http://(www.)site1.domain.com/ и http://(www.)site1.domain.com/.

Накопал множество документации. Есть даже весьма похожие на эту ситуацию. Но всё равно я что-то не могу составить RewriteCond и RewriteRule :(

Да. Как я прочитал, это делается с помощью mod_rewrite.

В DNS добавил А-запись *.domain.com. В httpd.conf в разделе <VirtualHost> в ServerAlias добавил *.domain.com. Далее в корне, т.е. внутри domain.com создал .htaccess для mod_rewrite, но никак не въеду :( Подскажите пожалуйста.

Принцип даже понятен. "Те, кто запрашивает http://(www.)site1.domain.com/, должны перенаправляться на http://(www.)domain.com/site1/, но адрес в браузере не должен добавлять ../site1/ к http://(www.)site1.domain.com/".

То есть, запросили http://(www.)site1.domain.com/index.html, и он должен идти в http://(www.)domain.com/site1/index.html, в URL показывая http://(www.)site1.domain.com/index.html. Таким же образом надо проделывать и со всеми другими каталогами внутри domain.com.

Подскажите, правильно ли я понимаю? И подскажите, как это реализовать, пожалуйста?
★
Примерно так:

RewriteCond %{HTTP_HOST} ^.+\.domain.com$
RewriteRule ^(.*)$ %{HTTP_HOST}/$1

Что-то вроде такого, но в этом случае надо будет создавать каталоги не 
/site1 , а /site1.domain.com
r_asian ★☆☆
()
Ответ на: комментарий от r_asian
У меня написаны рег. выражения вида

RewriteCond %{HTTP_HOST} ^.*\.domain.com$ [NC]
RewriteRule ^(.*)$ http://domain\.com/$1

При нём, при запросе http://domain.com/site1/ показывает страницу. А при запросе http://site1.domain.com/ идёт

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Если заменяю моё на этот:

RewriteCond %{HTTP_HOST} ^.+\.domain.com$
RewriteRule ^(.*)$ %{HTTP_HOST}/$1

То идёт тот же Internal Server Error. Чувствую, я где-то близок.
Gular ★
() автор топика
Ответ на: комментарий от r_asian
Уже спасибо великое! Технично.

При запросе http://site1.domain.com/ получаю то же самое, что и при запросе http://domain.com/site1.domain.com/. То биш, работает. Заминка в том тут, что не хотелось бы показывать изменение в адресной строке. Чтобы http://site1.domain.com/ не заменяло на http://domain.com/site1.domain.com/ при обработке. Надо как бы оставить http://site1.domain.com/ в строке.

Gular ★
() автор топика
Ответ на: комментарий от r_asian
И ещё я вот думаю, как бы обойтись без создания каталогов вида site1.domain.com, а ограничиться созданием каталогов site1, site2, ... siten. Дело в том, что в текущем домене уже есть не один каталог, который надо так заделать. Можно конечно скрипт написать, наверное, для переименования всех каталогов, но ведь наверно можно изменить рег. выражение.
Gular ★
() автор топика
Ответ на: комментарий от Gular
Хех, попробовал ещё вариант:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*) %{HTTP_HOST}/$1
RewriteRule ^(.*)\.domain\.com(.*) /$1$2

Теперь, может быть, работает. Но зацикливается:

Forbidden

You don't have permission to access /site1/site1/site1/site1/site1/site1/site1/site1/site1/site1/site1/site1/site1/
site1/site1/site1/site1/site1/site1/site1/site1/site1/site1/ on this server.

Сейчас [P] посмотрю.
Gular ★
() автор топика
Ответ на: комментарий от Gular
А вариант из документации не работает?

Virtual User Hosts

Description:
Assume that you want to provide www.username.host.domain.com for the homepage of username via just DNS A records to the same machine and without any virtualhosts on this machine.
Solution:

For HTTP/1.0 requests there is no solution, but for HTTP/1.1 requests which contain a Host: HTTP header we can use the following ruleset to rewrite http://www.username.host.com/anypath internally to /home/username/anypath:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^www\.([^.]+)\.host\.com(.*) /home/$1$2
Tigger ★★★★★
()
Ответ на: комментарий от Tigger
Хм. Я так понимаю, что это не мой случай. У меня же в domain.com идёт каталог site1. А тут выходит, что в domain.com должен быть username, а в нём anypath?
Gular ★
() автор топика
Ответ на: комментарий от Gular
>Хм. Я так понимаю, что это не мой случай. У меня же в domain.com идёт каталог site1. А тут выходит, что в domain.com должен быть username, а в нём anypath?

А какая разница? username - это собственно и есть твой site1, а anypath - директория внутри site1, к примеру, images. /home/username/anypath в твоём случае будет %{DOCUMENT_ROOT}/site1/anypath

Tigger ★★★★★
()
Ответ на: комментарий от Tigger
Похоже что сделал. Сейчас файл .htaccess такой:

----

cat .htaccess
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/(.+)
RewriteRule ^(.*) %{HTTP_HOST}/$1
RewriteRule ^(.*)\.domain\.com(.*) /$1$2

И это практически то, что надо! Но. На запрос с www., то есть, на http://www.site1.domain.com/ отвечает 404 ошибкой:

Not Found

The requested URL /www.site1/ was not found on this server.

:)

Надо добавить www.
Gular ★
() автор топика
Ответ на: комментарий от Gular
Ну вот:

RewriteEngine On RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC] RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] RewriteCond %{REQUEST_URI} !^/(.+) RewriteRule ^(.*) %{HTTP_HOST}/$1 RewriteRule ^www\.(.*)\.domain\.com(.*) /$1$2

Замечательно. Попробовал вот. Всё работает. :)

P.S.: Лишний убедился, что копания + гуру на форумах = результат. Похоже что, всем большое спасибо!

Gular ★
() автор топика
Ответ на: комментарий от Gular
[[Shit]]

Ну вот:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/(.+)
RewriteRule ^(.*) %{HTTP_HOST}/$1
RewriteRule ^www\.(.*)\.domain\.com(.*) /$1$2

Замечательно. Попробовал вот. Всё работает. :)

P.S.: Лишний убедился, что копания + гуру на форумах = результат. Похоже что, всем большое спасибо!
Gular ★
() автор топика
Ответ на: комментарий от Gular
Рано я радоваться стал.
Погонял этот .htacces и выяснил, что это работает лишь для index.html, то есть, запрос http://site1.domain.com/index.html работает, то есть мой текущий .htaccess обрабатывает только запросы к индексу. А запрос http://site1.domain.com/page.html не работает.

Как тут быть?
Gular ★
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.