Apache-2.2

在 Apache DirectoryMatch 指令中引用匹配的目錄

  • May 22, 2019

我正在嘗試將 Apache 配置為通過 mod_wsgi 託管多個 django 站點。mod_wsgi 設置教程給出了這個場景的範例配置,其中每個應用程序都在同一個目錄中:

WSGIScriptAliasMatch ^/([^/]+) /usr/local/django/$1/apache/django.wsgi

<DirectoryMatch ^/usr/local/django/([^/]+)/apache>
   Order deny,allow
   Allow from all
</DirectoryMatch>

我正在嘗試擴展此範例以添加為每個應用程序創建的密碼文件以使用 http 身份驗證。我想我可以通過為每個應用程序設置一個單獨的並行目錄並以在 WSGIScriptAliasMatch 中完成的方式引用匹配的目錄名稱來做到這一點,如下所示:

WSGIScriptAliasMatch ^/([^/]+) /usr/local/django/$1/apache/django.wsgi

<DirectoryMatch ^/usr/local/django/([^/]+)/apache>
   AuthType Basic
   AuthUserFile /usr/local/django-auth/$1/users.passwd
   AuthGroupFile /dev/null
   Require valid-user
</DirectoryMatch>

我曾假設“$1”會擴展到與 DirectoryMatch 的正則表達式匹配的參數,但是我無法進行身份驗證,並且我的錯誤日誌指出:

No such file or directory: Could not open password file: /usr/local/django-auth/$1/users.passwd

因此,似乎 ‘$1’ 並沒有像我想像的那樣被用於匹配的應用程序。有沒有辦法做到這一點?我不想在每個站點彈出時都為其添加新指令。

AuthUserFile 路徑是靜態的,無法根據 URL 進行擴展。

你也許應該看看:

http://code.google.com/p/modwsgi/wiki/AccessControlMechanisms

這將允許您提供自己的身份驗證提供程序。這可以查看傳遞給您的 check_password() 函式的“環境”字典中的請求資訊,並基於該資訊針對特定使用者數據庫驗證使用者。

請注意,對於 DirectoryMatch 指令,無論如何您都不能使用未命名的反向引用:

https://httpd.apache.org/docs/2.4/mod/core.html#directorymatch

從 2.4.8 開始,命名組和反向引用被擷取並寫入環境中,相應的名稱以“MATCH_”為前綴,並且大寫。這允許從表達式和模組(如 mod_rewrite)中引用路徑元素。為了防止混淆,編號(未命名)的反向引用將被忽略。改用命名組。

<DirectoryMatch "^/var/www/combined/(?<sitename>[^/]+)">
    Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</DirectoryMatch>

…根本不是,對於 2.2 (因為問題的標籤是)

https://httpd.apache.org/docs/2.2/mod/core.html#directorymatch

指示

描述:包含適用於匹配正則表達式的文件系統目錄及其子目錄的指令

Syntax:   <DirectoryMatch regex> ... </DirectoryMatch>

上下文:伺服器配置,虛擬主機

狀態:核心

模組:核心

<DirectoryMatch> and </DirectoryMatch> are used to enclose a group of directives which will apply only to the named directory and sub-directories of that directory (and the files within), the same as <Directory>. However, it takes as an argument a regular expression. For example:

將匹配 /www/ 中由三個數字組成的目錄。

行尾字元 行尾字元 ($) 不能與該指令匹配。

也可以看看

<Directory> for a description of how regular expressions are mixed in with normal <Directory>s

How <Directory>, <Location> and <Files> sections work for an explanation of how these different sections are combined when a request is received

引用自:https://serverfault.com/questions/118917