2015-06-16 5 views
1

Я хочу добавить IP-фильтр в свой файл .htaccess, но после того, как я его применил, появится слишком много переадресаций..htaccess | Слишком много переадресаций

Содержание .htaccess:

RewriteEngine On 

RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 
RewriteCond %{HTTPS} on 
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [L,R=301] 
RewriteCond %{HTTPS} on 

RewriteCond %{REMOTE_ADDR} xxx.xxx.xxx.xxx 
RewriteRule^/test.php [R=302,L] 

Почему я получаю эту ошибку?

+0

Потому что, если ваш '% {REMOTE_ADDR} 'matches, вы отправите заголовок' Location' '/ test.php', на который будет перенаправлен ваш браузер. В этот момент он будет соответствовать '% {REMOTE_ADDR}' и '^', а затем отправит заголовок 'Location''/test.php'. В этот момент .... – arco444

ответ

1

Я предполагаю, что вы пытаетесь сделать две вещи здесь:

  1. Force HTTPS и WWW.
  2. Перенаправление на test.php, если определенный IP делает запрос

вопрос вы столкнулись было связано с тем, что даже если IP-адрес был подкрепляются, он все еще проверяется на при достижении test.php , Поскольку снова будет матч, перенаправление будет циклически работать непрерывно. Добавляя соответствующее условие, мы проверяем, чтобы запрошенный URI не test.php перед проверкой IP-адресов. Строка, о которой идет речь, показана в нижней части моего ответа, которая включает усовершенствования вашего исходного кода.

RewriteEngine on 

# Force HTTPS 
RewriteCond %{HTTPS} !on 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

# Force www 
RewriteCond %{HTTP_HOST} ^www\. 
RewriteCond %{HTTPS}s ^on(s)|off 
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$ 
RewriteRule^%1%3%{REQUEST_URI} [R=301,L] 

# Redirect to test.php if a certain IP is matched 
RewriteCond %{REQUEST_URI} !^/test\.php 
RewriteCond %{REMOTE_ADDR} xxx.xxx.xxx.xxx 
RewriteRule^/test.php [R=302,L] 

Если необходимо указать несколько IP-адресов, то вы должны использовать OR флаг для каждого IP-адреса, кроме последнего:

# Redirect to test.php if a certain set of IPs are matched 
RewriteCond %{REQUEST_URI} !^/test\.php 
RewriteCond %{REMOTE_ADDR} xxx.xxx.xxx.xxx [OR] 
RewriteCond %{REMOTE_ADDR} xxx.xxx.xxx.xxx [OR] 
RewriteCond %{REMOTE_ADDR} xxx.xxx.xxx.xxx [OR] 
RewriteCond %{REMOTE_ADDR} xxx.xxx.xxx.xxx 
RewriteRule^/test.php [R=302,L] 
+0

Действительно - я думал, что цикл исходил из теста для 'www.'. Обновит мой ответ, спасибо, что указали это. –

+0

Большое спасибо. Могу ли я сделать что-то, чтобы скрыть URL? Итак, если я хочу перенаправить файл в подпапку, как я могу переписать отображаемый url ?, например, «/test/index.html» -> «/». – Nigho

+0

Рад, что это сработало для вас. Если у вас есть новый вопрос, пожалуйста, [спросите его отдельно] (http://stackoverflow.com/questions/ask), поскольку на ваш исходный вопрос был дан ответ. Однако, как примечание, это непрактично. Лучше перенаправить на отдельную страницу. Однако вы можете создать правило, которое сопоставляет '/ test' с'/test.php' перед проверкой IP-адресов. Затем вы можете перенаправить на '/ test'. –