Сопоставление полного URL-адреса за секунду перезаписи

#.htaccess #mod-rewrite

#.htaccess #мод-перезапись

Вопрос:

Я пытаюсь заблокировать весь почтовый доступ к сайту (и вернуть 403), за исключением 2 IP-адресов и одного URL-адреса (http://mydomain.com/about-us/contact-us /).

Вот что у меня есть:

 RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !=1.2.3.4
RewriteCond %{REMOTE_ADDR} !=4.3.2.1
RewriteCond %{REQUEST_URI} !^http://mydomain.com/about-us/contact-us/$
RewriteRule ^ / [F]
  

Эти правила разрешают доступ со всех IP-адресов должным образом, но страница контактов по-прежнему недоступна. Я не уверен, что правильно использую REQUEST_URI ?

Я также пробовал варианты с относительными URL-адресами, например RewriteCond %{REQUEST_URI} !^/about-us/contact-us$ , и RewriteCond %{REQUEST_URI} !^/about-us/contact-us/$ без удачи.

Что я делаю не так, пожалуйста?

Комментарии:

1. Правильный способ его использования заключается в следующем: RewriteCond %{REQUEST_URI} !^/about-us/contact-us/$ . Это должно работать так, как ожидалось, должна быть другая проблема

Ответ №1:

Мне кажется, что ваше правило для имени файла слишком специфично. Если вы немного расслабите его, это должно сработать. Я внес несколько других эстетических изменений.

Попробуйте:

 RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !^1.2.3.4
RewriteCond %{REMOTE_ADDR} !^4.3.2.1
RewriteCond %{REQUEST_URI} !about-us/contact-us
RewriteRule ^ - [F]
  

Ответ №2:

Хорошо, оказывается, что способ, которым я пробовал это ( !^/about-us/contact-us$ ), БЫЛ правильным, но сгенерированные WordPress правила .htaccess для постоянных ссылок либо останавливали его работу, либо переопределяли его. Итак, спасибо Justing и zx81 за подтверждение правильности общего метода.

Для всех, кто еще сталкивается с этой проблемой, WordPress добавит следующие правила (на момент написания на WordPress v3. *), когда будут включены постоянные ссылки:

 # BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
  

Это ‘L’, обозначающее ПОСЛЕДНЕЕ правило, нарушает любое дальнейшее сопоставление.

Теперь у меня есть:

 # BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !=1.2.3.4
RewriteCond %{REMOTE_ADDR} !=4.3.2.1
RewriteCond %{REQUEST_URI} !^/about-us/contact-us/$
RewriteRule ^ / [F]
</IfModule>
# END WordPress
  

…и это работает так, как планировалось. Конечно, это будет перезаписываться всякий раз, когда настройки постоянных ссылок сохраняются или изменяются в WP admin :/