我正在尝试在一个公共URL(https://example.com/sync)下为我的用户提供一个唯一的目录。以前,我使用重写规则来管理此问题,该规则只是将远程用户名附加到根目录中以进行“同步”。现在,用户登录ID与目录名称不同。根据apache文档,authn_dbd在额外变量中以前缀AUTHENTICATE_提供额外返回的列。
<Directory "/srv/www/sync/">
AuthDBDUserPWQuery "SELECT passphrase, identifier FROM webserver.fn_authenticate_context('SYNC') where login_id = %s"
RewriteEngine On
RewriteCond %{AUTHENTICATE_IDENTIFIER} ^(.+)$
RewriteRule ^\/(.*)$ /%{AUTHENTICATE_IDENTIFIER}/$1 [NS,L]
</Directory>
这应提供我的重写规则所需的标识符。但是,重写发生时标识符似乎不可用。将带有内容的标头添加到响应即可并提供内容。
激活直到trace8的日志表明,首先处理身份验证,然后处理重写条件,但该值仍然为空。
答案 0 :(得分:0)
搜索了一段时间后,我发现没有可靠的方法来使用Apache dbd
的不同“功能”。它会为另外返回的列生成变量-是否生成。变量在CGI中可用,但之前没有,甚至没有。错误仅在启动阶段记录下来,随后被静默丢弃。因此,如果您根本没有获得成功的身份验证,则根本原因可能是权限问题。验证这一点的唯一方法是使用dbd用于访问数据库的凭据执行请求。
解决我的原始问题的方法是,忘记身份验证请求中记录的其他列选项,并向数据库运行另一个单独的请求。工作片段:
### Cloud Synchronization (Web DAV service)
Define _SYNC_CLOUD_PREFIX /sync
# We need the rewrite engine here...
RewriteEngine On
# define a rewrite map which looks up the home directory for the user...
RewriteMap dbd_sync_home "dbd:SELECT dir_home FROM webserver.authorize_for_context('SYNC', %s);"
# redirect /sync to /sync/
RedirectMatch permanent ^${_SYNC_CLOUD_PREFIX}$ ${_SYNC_CLOUD_PREFIX}/
# Rewrite /sync/xxx to /srv/www/sync/<domain>/<user>/xxx
RewriteCond %{LA-U:REMOTE_USER} ^(.+)$
RewriteCond %{REQUEST_URI} ^${_SYNC_CLOUD_PREFIX}
RewriteRule ^${_SYNC_CLOUD_PREFIX}/(.*)$ /srv/www/sync/${dbd_sync_home:%{LA-U:REMOTE_USER}}/$1 [L]
# Authorize when hitting the location /sync/
<Location "${_SYNC_CLOUD_PREFIX}/">
DAV On
SSLRequireSSL
Options +FollowSymLinks
AuthType Basic
AuthName "Sync Heaven"
# To cache credentials, put socache ahead of dbd here
AuthBasicProvider socache dbd
AuthnCacheContext www-sync
AuthnCacheProvideFor dbd
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery "SELECT passphrase FROM webserver.authorize_for_context('SYNC', %s);"
Require method OPTIONS
Require valid-user
</Location>
UnDefine _SYNC_CLOUD_PREFIX