Пользовательская страница аутентификации - Apache mod_auth_form - Ошибка 405 Метод не разрешен
У меня проблемы с попыткой заставить работать мод apache 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 [email protected]
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/
Если бы кто-нибудь мог объяснить мне, что я сделал здесь неправильно, чтобы создать эту ошибку, это было бы очень признательно, спасибо!
2 ответа
Я, наконец, получил эту работу, и я ступил на этот вопрос, пытаясь найти решение своих проблем.
Вы получаете эту ошибку, потому что ваш вызов перехватывается обработчиком form-login-handler, который поддерживает только POST.
Хитрость в том, что SetHandler
Директива должна быть активной только для URL, который будет использоваться в качестве действия формы аутентификации. Все другие защищенные ресурсы должны использовать ту же конфигурацию, но без этого обработчика.
Вот рабочая конфигурация:
<VirtualHost *:80>
ServerAdmin [email protected]
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¹. Может быть, еще раз проверьте свою форму входа?