Перенаправление поддоменов .htaccess не работает - PullRequest
2 голосов
/ 17 ноября 2010

Хорошо, теперь я потерялся.

Я пытаюсь сделать простое перенаправление .htaccess поддоменов в определенную папку на сервере, что означает все

subdomain.mywebsite.com

перейдет на

www.mywebsite.com/s_subdomain

Но по некоторым причинам это не работает.

Я пробовал много настроек в .htaccess, но безрезультатно. Теперь в моем .htaccess у меня есть:

RewriteEngine on

Options +FollowSymLinks
Options +SymlinksIfOwnerMatch

RewriteCond %{HTTP_HOST} !^(www|ftp|mail)\.mywebsite\.com
RewriteCond %{HTTP_HOST} ^([^.]+)\.mywebsite\.com
RewriteRule (.*) /s_%1/$1 [L]

Есть ли другие настройки или я что-то пропустил?

PS. - У меня нет доступа к http.conf. Я должен сделать это, используя только .htaccess

Спасибо!

Ответы [ 4 ]

3 голосов
/ 17 ноября 2010

Это просто "обычная" перезапись (браузер ее не увидит).Чтобы перенаправить, добавьте флаг R к вашему RewriteRule.

RewriteRule (.*) /s_%1/$1 [L,R]

Остальное кажется правильным, хотя я не проверял егоДля отладки вы можете рассмотреть RewriteLog, см. http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog

1 голос
/ 02 декабря 2010

Итак, ни одно из решений не работает?Тогда попробуйте что-нибудь простое.

RewriteEngine on

RewriteCond ${SERVER_NAME} ^(subdomain)\.yoursite\.com$ [nc]
RewriteRule ^(.*)$ http://www.yoursite.com/s_%1/$1 [L,R]

Чтобы проверить, правильно ли обрабатывается ваш поддомен, создайте файл random.html, поместите его туда, откуда его следует прочитать, и попробуйте открыть его с помощью http://subdomain.yoursite.com/random.html.Затем вы можете попробовать что-то вроде:

RewriteRule ^random.html - [F]

... и если это блокирует доступ к файлу, попробуйте добавить

RewriteCond ${SERVER_NAME} ^subdomain\.yoursite\.com$ [nc]

к предыдущему правилу, чтобы заблокировать доступ к этому файлу,чтобы убедиться, что движок переписывания действительно соответствует вашим правилам.Это будет нацелено только на желаемый поддомен (www.yoursite.com/random.html должен работать, но доступ через поддомен не должен).

Тогда, если эти правила работают, это просто вопрос добавления большего количества материала и просмотракогда он перестает работать.

0 голосов
/ 02 декабря 2010

У нас есть аналогичная вещь, работающая на наших виртуальных машинах, где мы перенаправляем что-нибудь .usertld в папку для этого домена, которая была в httpd.conf, пробовали в .htaccess и, как у вас, это не работало. 1001 *

Тонкая настройка, это работает для меня (моя виртуальная машина занимает tld, называемое benb, но смена ее на ваш домен должна подойти):

    RewriteCond %{HTTP_HOST} !^www\.benb
    RewriteCond %{HTTP_HOST} ^(.*)\.benb
    RewriteCond %{REQUEST_URI} !^/{0,1}s_
    RewriteRule ^(.*)$ s_%1/$1 [L]

Также это захватывает весь текст перед доменом .. вы должны иметь возможность изменить:

RewriteCond %{HTTP_HOST} ^(.*)\.benb

до

RewriteCond %{HTTP_HOST} ^([^.]+)\.benb

для обработки всего 1 уровня поддоменов. Также ваша другая часть о (www | ftp | mail) тоже будет работать нормально.

0 голосов
/ 01 декабря 2010

RewriteRules - сука.

Должно работать следующее:

.htaccess

RewriteCond ${SERVER_NAME} !^(www|ftp|mail)\.example\.com$
RewriteCond ${SERVER_NAME} !^([^.]+)\.example\.com$
RewriteRule .* redirect.php?to=%1

redirect.php

<?php
   $desired_server_name = 'http://example.com';
   $subdir = 's_' . $_GET['to'];

   $url = $desired_server_name . '/' . $to . $_SERVER['REQUEST_URI'];

// Permanent redirects
   header('HTTP/1.1 301 Moved Permanently');

// Or simple redirects:
   header('HTTP/1.1 302 Found');

   header('Location: '.$url);
?>

Работает на моем сервере (Debian 4 / Apache 2).

Бонус: НИКОГДА не используйте HTTP_HOST! Смотрите следующий запрос:

 HTTP/1.1 GET /foo/bar.php
 Host: www.host.tld"><script>alert(/Hello/)</script
 Connection: close

Если вы используете $_SERVER['HTTP_HOST'] в своих скриптах .php для создания ссылок или правил .htaccess в этом отношении, а "www.host.tld" является виртуальным хостом или единственным хостом, настроенным для Apache, XSS в HTTP заголовок запроса будет передан без экранирования.

...