2013-01-30 371 views
4

Мне нужно перенаправить пользователя, если переменные SERVER_ADDR и SERVER_NAME не совпадают.apache httpd - RewriteCond SERVER_NAME не равно SERVER_ADDR

У меня есть следующее правило в моем файле httpd.conf:

RewriteEngine on 
RewriteCond %{SERVER_NAME} !%{SERVER_ADDR} 
RewriteRule .* /myRedirectPage.html [PT] 

Когда SERVER_NAME и server_addr не совпадают, я правильно попадаю. Однако я также перенаправляюсь, даже если они совпадают.

Если я использую следующее условие оно работает как для согласования и несовпадающих сценариев: (где 192.168.1.1 является сервер IP)

RewriteCond %{SERVER_NAME} !192.168.1.1 

Чтобы проверить, если переменные совпадают, я РНР $_SERVER['SERVER_NAME'] и $_SERVER['SERVER_ADDR'] переменных.

Как написать RewriteCond так, чтобы он не перенаправлял пользователя, если SERVER_NAME и SERVER_ADDR совпадают?

+0

Это немного запутанно. «SERVER_ADDR» (IP) и «SERVER_NAME» (имя) - это два способа идентифицировать один и тот же домен. Поэтому они всегда «соответствуют», потому что это переменные, передаваемые сервером. С другой стороны, один является числовым, а другой - строкой. Как вы их сравниваете, даже с PHP-кодом? –

+0

Я показываю их с помощью 'vardump ($ _ SERVER)', но php идентифицирует оба значения как строки. Я делаю пленный портал, где весь трафик tcp перенаправляется на сервер. Например, если пользователь пытается посетить 'http: // www.google.com /', пользователь будет перенаправлен на мою страницу php, где 'SERVER_ADDR = 192.168.1.1' и' SERVER_NAME = www.google.com' , – Daniel

ответ

8

Вы не можете использовать серверные переменные в правой части RewriteCond, поэтому вы сопоставляетесь с литеральной строкой "%{SERVER_ADDR}", а не с переменной и, следовательно, поскольку ваше совпадение отрицается («!»), Правило всегда совпадает ,

Я думаю, что вы можете сделать что-то подобное, хотя я никогда не работал с этим конкретным форматом себя:

RewriteCond %{SERVER_NAME},%{SERVER_ADDR} ^(.*),\1

Идея заключается в том, что вы делаете два матча - вы соответствие %{SERVER_NAME} против любого (всегда совпадения) и получения результата, а затем сопоставления %{SERVER_ADDR} с обратным отношением к первому совпадению, которое соответствует %{SERVER_NAME}.

Опять же, я сам не использовал такое правило, просто прочитал об этом, поэтому может потребоваться некоторая настройка.

+0

Этот метод работает для меня. – reinierpost

+1

Помните, что содержимое '% {SERVER_NAME}' отличается от значения UseCanonicalName. Если у вас есть «Вкл», то «{% SERVER_NAME}» просто переносит имя_сервера из VirtualHost. Поэтому, возможно, вы хотите всегда использовать '{% HTTP_HOST}' в вашем случае. –

Смежные вопросы