私はvirtualhostを取得しました。これにはいくつかのアクセス制限が次のように構成されています。
<Location "/">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /var/www/domain/htdocs/.htpasswd
Require valid-user
</Location>
それに加えて、次のconf
ファイルがあります。
Alias /.well-known/acme-challenge/ "/var/www/letsencrypt/"
<Location /.well-known/acme-challenge/>
# Security Options
Options None
AllowOverride None
ForceType text/plain
RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
# Do not redirect to https or perform other rewrites
RewriteEngine off
</Location>
認証なしでアクセスできるようにするには、/.well-known/acme-challenge/
が必要です。
conf
-ファイルにRequire all granted
のさまざまなバリエーションを追加しようとしましたが、うまくいきませんでした。
すべての仮想ホストに対して認証なしで/.well-known/acme-challenge/
にアクセスできるようにするにはどうすればよいですか? (私は仮想ホストを変更したくありません。この仮想ホストは単なる例です)。
サーバーコンテキスト内の仮想ホストコンテキストの<Location />
ステートメントをオーバーライドする可能性はありません。 Apache doc から:
<VirtualHost>
セクション内のセクションは、仮想ホスト定義外の対応するセクションの後に適用されます。これにより、仮想ホストはメインサーバーの構成を上書きできます。
マージの順序は(最後にマージされたグループが勝つ)です。
<Directory>
(正規表現を除く)と.htaccessを同時に実行(許可されている場合は.htaccessを使用して<Directory>
を上書き)<DirectoryMatch>
(および<Directory "~">
)<Files>
と<FilesMatch>
は同時に完了<Location>
と<LocationMatch>
は同時に完了<If>
<Directory>
以外の各グループは、構成ファイルに表示される順序で処理されます。
<VirtualHost>
は<If>
内では使用できないため、<Location>
が最後にマージされます。
Https vhostでのみサイトにサービスを提供する場合(認証のために妥当な方法)、(https vhostに影響を与えずに)以下を実行できます。
<VirtualHost *:80>
ServerName example.com
Include letsencrypt-well-known.conf
RedirectMatch permanent ^(?!/\.well-known/acme-challenge/)(.*) "https://example.com$1"
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
<Location "/">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /var/www/domain/htdocs/.htpasswd
Require valid-user
</Location>
...
</VirtualHost>
letsencrypt-well-known.conf
:
<IfModule mod_proxy.c>
ProxyPass /.well-known !
</IfModule>
Alias /.well-known/ /var/www/html/.well-known/
<Location /.well-known/acme-challenge>
Options None
Require all granted
</Location>
<Macro RedirectTo $protocol $domain>
<If "'${well_known_enabled}' == 'On' && %{REQUEST_URI} =~ m#^/\.well-known(/|$)#">
# Do nothing
</If>
<ElseIf "tolower(req('Host')) != '$domain' || tolower(%{REQUEST_SCHEME}) != '$protocol'">
Redirect permanent / $protocol://$domain/
</ElseIf>
</Macro>
<VirtualHost *:80>
ServerName example.com
Include letsencrypt-well-known.conf
RedirectTo https example.com
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
<Location "/">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /var/www/domain/htdocs/.htpasswd
Require valid-user
</Location>
...
</VirtualHost>
letsencrypt-well-known.conf
:
<IfModule mod_proxy.c>
ProxyPass /.well-known !
</IfModule>
Define well_known_enabled On
Define well_known_root "/var/www/html"
Alias /.well-known/ "${well_known_root}/.well-known/
<Directory "${well_known_root}/.well-known">
Options None
AllowOverride None
Require all granted
</Directory>
<Location /.well-known/acme-challenge>
Options None
Require all granted
</Location>
Apache 2.4では、次のようにRequire expr
ステートメントを最初のロケーションブロックに追加して、リクエストURIを評価できます。
Require expr %{REQUEST_URI} =~ m#^/.well-known/acme-challenge/.*#
またはその線に沿った何か(実際にはテストされていない構文)。奇妙なm#
構文は、正規表現が文字列で/
を使用できるようにするための代替形式です。
expr
docs: https://httpd.Apache.org/docs/2.4/expr.html