У меня проблемы с попыткой заставить работать apache mod auth_form.
У меня есть поддомен, который я хочу защитить и использовать для различных административных функций на моем веб-сайте.
Когда я отправляю форму авторизации, я получаю:
Method Not Allowed
The requested method GET is not allowed for the URL /admin/index.html.
Я старался изо всех сил следовать инструкциям в этих документах:
http://httpd.apache.org/docs/current/mod/mod_auth_form.html
и тут:
http://httpd.apache.org/docs/current/mod/mod_session.html
Я также использую Apache 2.4.9 со всеми необходимыми модулями для работы.
Итак, я настроил поддомен следующим образом:
/index.html (Public root / auth form)
/admin/index.html (The contents of the folder i wish to protect)
/index.html
содержит следующее:
<form method="POST" action="/admin">
User: <input type="text" name="httpd_username" value="" />
Pass: <input type="password" name="httpd_password" value="" />
<input type="submit" name="login" value="Login" />
</form>
Для блока Vhost, который управляет поддоменом, я добавил следующее (отмечая, что я включаю GET и POST для этого домена, поскольку по умолчанию они отключены):
<VirtualHost *:80>
ServerAdmin webmaster@mydomain.com
ServerName mydomain.com
ServerAlias admin.mydomain.com
DocumentRoot /var/www/mydomain.com/admin/
<Directory /var/www/mydomain.com/admin/>
<LimitExcept GET POST>
Require all denied
</LimitExcept>
Options -ExecCGI -FollowSymLinks -Includes -Indexes -MultiViews
Require all granted
</Directory>
<Location /admin>
SetHandler form-login-handler
AuthFormLoginRequiredLocation http://admin.mydomain.com/index.html
AuthFormLoginSuccessLocation http://admin.mydomain.com/admin/index.html
AuthFormProvider file
AuthUserFile /var/www/mydomain.com/admin_inc/.htpasswd
AuthType form
AuthName realm
Session On
SessionCookieName session path=/private;domain=admin.mydomain.com;httponly;secure;
SessionCryptoPassphrase secret
</Location>
</VirtualHost>
В журнале ошибок apache я получаю следующее:
[Mon May 19 10:26:38.xxxxxx 2014] [auth_form:error] [pid xxxxx] [client xxxxxx:xxxxx] AH01811: the form-login-handler only supports the POST method for /admin/index.html, referer: http://admin.mydomain.com/
Если бы кто-нибудь мог объяснить мне, что я сделал здесь не так, чтобы создать эту ошибку, я был бы очень признателен, спасибо!
Наконец-то у меня все заработало, и я задался вопросом, пытаясь найти решения своих проблем.
Вы получаете эту ошибку, потому что ваш вызов перехватывается обработчиком входа в систему, который поддерживает только POST.
Хитрость в том, что SetHandler
Директива должна быть активна только для URL-адреса, который будет использоваться в качестве действия формы аутентификации. Все другие защищенные ресурсы должны использовать ту же конфигурацию, но без этого обработчика.
Вот рабочая конфигурация:
<VirtualHost *:80>
ServerAdmin webmaster@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/
<Location /admin>
# Protect all resources under /admin with form auth. Note that the login form is NOT under /admin : not sure this is required, but this is how I got it working
AuthFormLoginRequiredLocation http://www.example.com/index.html
AuthFormLoginSuccessLocation http://www.example.com/admin/index.html
AuthFormProvider file
AuthUserFile /var/www/example.com/.htpasswd
AuthType form
AuthName realm
Session On
SessionCookieName session path=/private;domain=www.example.com;httponly;secure;
SessionCryptoPassphrase secret
</Location>
<Location /admin/dologin>
# Since this location is a sub-path of the previous one, it inherits all parameters above
# It will be the only URL to be able to process form logins, and the only one to require POST
SetHandler form-login-handler
</Location>
</VirtualHost>
Конечно, вам нужно установить свой атрибут действия в форме на URL-адрес обработчика входа:
<form method="POST" action="/admin/dologin">
User: <input type="text" name="httpd_username" value="" />
Pass: <input type="password" name="httpd_password" value="" />
<input type="submit" name="login" value="Login" />
</form>
Надеюсь, это кому-то поможет (хотя этой ветке 4 года! :))
Вы каким-то образом отправляете учетные данные для входа каким-то методом, отличным от POST¹. Может быть, перепроверьте форму входа?