2010-12-30 2 views
8

У меня есть rewritemap, у которого есть список доменов для перенаправления. В настоящее время я должен перечислить www.foo.com и foo.com на карте перезаписи. Мне было интересно, есть ли способ проверить rewritecond для www и non-www в той же строке.Как я могу сопоставить www AND non-www в rewritecond?

# Rewrite Map 
foo.com file.php 
www.foo.com file.php 

# modrewrite 
RewriteCond ${domainmappings:%{HTTP_HOST}} ^(.+)$ [NC] 
RewriteCond %1 !^NOTFOUND$ 
RewriteRule ^.*$ www.domain.com/%1 [L,R=301] 

Я пытался делать такие вещи, как (WWW.)% {HTTP_HOST} или^(WWW.)% {HTTP_HOST}, но не повезло.

ответ

15

Это следует сделать это:

RewriteCond %{HTTP_HOST} ^(www\.)?(.+) 
RewriteCond ${domainmappings:%2} ^(.+)$ [NC] 
RewriteRule^/%1 [L,R=301] 

Первый RewriteCond удалит дополнительный www. префикс. Остальная часть затем используется как параметр для переписывающей карты во втором RewriteCond.

Простой текстовый файл переписан карта возвращает пустую строку, если совпадение не найдено:

Если ключ найден, карта-функция конструкт замещена SubstValue. Если ключ не найден, он заменяется DefaultValue или пустой строкой, если нет DefaultValue.

Так что, если второе условие выполняется (обратите внимание на ^(.+)$), матч был найден и %1 будет содержать SubstValue (в данном случае file.php).

+0

, что не работает, потому что я все равно должен иметь записи для www.foo.com и foo.com. Я хочу только иметь запись для foo.com – Scott

+0

@Scott Foster: Исправлено это. – Gumbo

+0

Практически там. И www.foo.com, и foo.com идут в нужное место, но браузер просто перенаправляет, пока браузер не уйдет. Любая идея почему? – Scott

5

С поста здесь

http://www.eukhost.com/forums/f15/simple-rewriterule-set-redirect-domain-6570/

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^xyz.com$ [OR] 
RewriteCond %{HTTP_HOST} ^www.xyz.com$ 
RewriteRule ^(.*)$ http://www.xyz.com/test//$1 [R=301,L] 
+0

Проблема в том, что у меня много доменов и не могу иметь xyz.com в rewritecond или rewriterule. – Scott

+0

также, я хочу, чтобы он соответствовал версии foo.com в rewritemap, поэтому он должен был бы сделать что-то вроде подстроки. – Scott

0

Вы можете попытаться сделать WWW. часть необязательно со следующим:

# Rewrite Map 
www.foo.com file.php 

# modrewrite 

# redirect to www domain always 
RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)$ 
RewriteRule (.*) http://www\.%1/$1 [L,R=301,QSA) 

# redirect following the map 
RewriteCond ${domainmappings:%{HTTP_HOST}} ^(.+)$ [NC] 
RewriteCond %1 !^NOTFOUND$ 
RewriteRule ^.*$ www.domain.com/%1 [L,R=301] 

Это первый переадресовать anything.anything к www.anything.anything, а затем применить правило на следующем запросе. Не слишком хорошо осведомлены о переписывании карт, хотя никаких гарантий нет.

0
RewriteCond %{HTTPS} off 

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

RewriteCond %{HTTP_HOST} ^www.domain.com$ 

RewriteRule^https://www.domain.com%{REQUEST_URI} [R=301,L] 
+0

_I интересовался, есть ли способ проверить повторную запись как для www, так и для не-www в той же строке. –