Назад | Перейти на главную страницу

Пользовательская страница аутентификации - Apache mod_auth_form - Ошибка 405 Метод недопустим

У меня проблемы с попыткой заставить работать 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¹. Может быть, перепроверьте форму входа?

¹http://code.ohloh.net/file?fid=Pwx9mfavxhieWn8XSiBldWz63zI&cid=h1J7pf7LYjw&s=&fp=305270&mp&projSelected=true#L1127