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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.