web-dev-qa-db-ja.com

Apache-認証なしでグローバルにエイリアスされたディレクトリへのアクセスを許可する

私は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/にアクセスできるようにするにはどうすればよいですか? (私は仮想ホストを変更したくありません。この仮想ホストは単なる例です)。

3
Zulakis

サーバーコンテキスト内の仮想ホストコンテキストの<Location />ステートメントをオーバーライドする可能性はありません。 Apache doc から:

<VirtualHost>セクション内のセクションは、仮想ホスト定義外の対応するセクションの後に適用されます。これにより、仮想ホストはメインサーバーの構成を上書きできます。

マージの順序は(最後にマージされたグループが勝つ)です。

  1. <Directory>(正規表現を除く)と.htaccessを同時に実行(許可されている場合は.htaccessを使用して<Directory>を上書き)
  2. <DirectoryMatch>(および<Directory "~">
  3. <Files><FilesMatch>は同時に完了
  4. <Location><LocationMatch>は同時に完了
  5. <If>

<Directory>以外の各グループは、構成ファイルに表示される順序で処理されます。

<VirtualHost><If>内では使用できないため、<Location>が最後にマージされます。

だが

Https vhostでのみサイトにサービスを提供する場合(認証のために妥当な方法)、(https vhostに影響を与えずに)以下を実行できます。

Apache v2.2

<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>

Apache v2.4

<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>
3
rda

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

0
Sven