Сначала правило, которое работает:
DirectoryIndex index.php
ErrorDocument 403 /form.html
RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule . - [F,L]
Это означает http://example.comи http://example.com/index.phpможет быть открыт только через POST.
Теперь проблема
Я добавил этот дополнительный набор правил:
RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule . - [F,L]
Теперь я отправляю POST снова, http://example.comно получаю эту ошибку:
Forbidden
You don't have permission to access / on this server.
Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
Это не имеет смысла, потому что правило НЕ должно отлавливать запросы при index.phpотправке 403, но хорошо, я расширил второе правило следующим образом:
RewriteCond %{REQUEST_URI} !^/form\.html$
RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule . - [F,L]
И отправка снова POST на http://example.com не возвращает 500, но я все равно получаю 403 ?!
Обновление 1
Если я удаляю первый набор правил, второй работает один, как и ожидалось. Это означает только http://example.com, http://example.com/index.phpи http://example.com/form.htmlмогут быть доступны.
Обновление 2
Если я использую оба набора правил и отправляю свой POST, http://example.com/index.phpя не получаю никаких ошибок ?!
Так что правила мешают, только если я отправил POST на корневой URL. Но почему?