Require names a provider: all, method, env, expr, user, valid-user, group, or ip, host and local (IP and Referrer Checks). Several Require lines act as one <RequireAny>: one grant suffices. <RequireAll> needs every rule to pass, and Require not can only refuse, so it sits in a <RequireAll>. This wiki lets anyone read and editors write, and shuts out one editor:
# /var/www/example/wiki/.htaccess - Needs: mod_authz_groupfile; AllowOverride AuthConfig
AuthType Basic
AuthName "Wiki"
AuthUserFile /etc/apache2/auth/htpasswd
AuthGroupFile /etc/apache2/auth/groups
<RequireAll>
<RequireAny>
Require method GET HEAD OPTIONS
Require group editors
</RequireAny>
Require not user carol
</RequireAll>The page echoes REQUEST_METHOD and REMOTE_USER. Each line is one curl 3,008 -X request, with or without a login, and its status:
GET GET as anonymous 200 POST 401 POST alice POST as alice 200 POST bob 401 POST carol 401 GET carol GET as anonymous 200
The last line surprises: Carol sent a login, yet PHP saw no user. The method rule granted, so Apache 129 never checked her password, and Require not user ignores a request with no user; code that trusts REMOTE_USER needs a rule that demands one. Require expr takes <If> expressions (Directives and Containers). A subdirectory's own Require lines replace these unless it sets AuthMerging And.