Субдомен в папку с использованием Apache mod_rewrite - PullRequest
2 голосов
/ 11 августа 2011

Я хочу сопоставить весь мой поддомен с папкой.
Например, subdomain.domain.com должен отображать содержимое домена domain.com/clients/subdmain (прозрачно)

RewriteCond %{HTTP_HOST} ^(.+)\.oomail\.org
RewriteCond %{HTTP_HOST} !^www\.oomail\.org [NC]
RewriteRule ^(.+)$ /var/www/clients/%1/$1

Я получил 500 Внутренняя ошибка сервера. Чтобы проверить, в чем проблема, я добавил флаг [R]

RewriteRule ^(.+)$ /var/www/clients/%1/$1 [R]

Я получил этот результат в адресной строке

http://q1.oomail.org/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/always.html

Затем я создал файл details.php, который выводит данные переменной $ _GET. Его содержание

<code><pre>
<?php
var_dump($_GET);
?>

и изменил RewriteRule на (Примечание: Я отправляю $ 1 и% 1 в details.php, который показывает его содержание )

RewriteRule ^(.+)$ details.php?p=%1&d=$1

И после открытия http://subdomain.oomail.org/file.html я получил вывод как

array(2) {
  ["p"]=>
  string(9) "subdomain"
  ["d"]=>
  string(11) "details.php"
}

Из которых переменная p является правильной (значение% 1), которая является «поддоменом», НО d (значение $ 1) - это details.php, который я ожидал получить file.html , который я открыл в URL. Куда я иду не так? или Как я могу извлечь file.html (URI) в переменную для сопоставления?

1 Ответ

5 голосов
/ 11 августа 2011

Используйте это правило:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/clients/
RewriteCond %{HTTP_HOST} ^(.+)\.oomail\.org
RewriteCond %{HTTP_HOST} !^www\.oomail\.org
RewriteRule ^(.*)$ /clients/%1/$1 [L]

В вашей первой попытке у вас был бесконечный цикл перезаписи , который Apache должен был прервать (по умолчанию не более 10 итераций). Во второй попытке вы сталкиваетесь с ограниченным циклом перезаписи (я думаю, 2 итерации). Вот как работает mod_rewrite, и вы должны учитывать такую ​​возможность в своих правилах, особенно когда вы используете .* в качестве соответствующего шаблона.

Самое первое условие в моем правиле будет препятствовать выполнению цикла перезаписи (значит, правило будет работать только на самой первой итерации). К сожалению, это означает некоторые ограничения: исходный URL НЕ МОЖЕТ начинаться с /clients/. Например: этот URL не будет перенаправлен: http://something.example.com/clients/hello-kitten.php.

Решение - переименуйте папку clients во что-то более уникальное: например _clients_folder_ (вам, очевидно, придется изменить эту папку и в правилах перезаписи).

Что-то прочитать: Флаг RewriteRule Last [L] не работает?

...