我们在我们的某个子域上有“HTTP基本认证”,但希望允许所有内容访问该子域上的特定URL而无需进行身份验证(对于第三方访问我们的webhook URL)。
所以我尝试使用SetEnvIf Request_URI ^/webhook/ allow
来允许Allow from env=allow
(完整文件如下),但似乎因为我们有一些mod_rewrite规则来重写所有这些URL到PHP入口点,Request_URI实际上从来没有/webhook一旦到达这一点(猜测,但不知道如何100%确认这一点。
它仍然要求一个基本的auth用户/通行证,而不管URL是什么。
请注意,.htaccess文件在我们所有的域/子域上都是相同的,而VirtualHost可以只为这个子域配置。
完整的VirtualHost配置,包含“HTTP Basic Auth”配置部分:
<VirtualHost *:80>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=permanent,L]
DocumentRoot /var/www/sub.ourdomain.co.uk/blah/www
ServerAdmin [email protected]
ServerName sub.ourdomain.co.uk
ServerAlias www.sub.ourdomain.co.uk
ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 403 /403.html
ErrorDocument 404 /error.php
ErrorDocument 405 /error.php
ErrorDocument 408 /error.php
ErrorDocument 410 /error.php
ErrorDocument 411 /error.php
ErrorDocument 412 /error.php
ErrorDocument 413 /error.php
ErrorDocument 414 /error.php
ErrorDocument 415 /error.php
ErrorDocument 500 /error.php
ErrorDocument 501 /error.php
ErrorDocument 502 /error.php
ErrorDocument 503 /error.php
ErrorDocument 506 /error.php
ErrorLog /var/log/httpd/sub.ourdomain.co.uk.apache.log
CustomLog /var/log/httpd/sub.ourdomain.co.uk.access.log combined
<Directory "/var/www/sub.ourdomain.co.uk/blah/www">
SetEnvIf Request_URI ^/webhook/ allow
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/httpd/passwords/sub.ourdomain.co.uk
# Setup a deny/allow
Order Deny,Allow
# Deny from everyone
Deny from all
# except if either of these are satisfied
Satisfy any
# 1. a valid authenticated user
Require valid-user
# or 2. the "allow" var is set
Allow from env=allow
</Directory>
</VirtualHost>
.htaccess mod_rewrite规则:
RewriteCond %{REQUEST_METHOD} !(^GET|^POST|^HEAD)
RewriteRule .* - [R=405,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(/img|/js|/css|/fonts)
RewriteRule ^(.*)$ /boot.php
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ /boot.php
编辑1-基于我也尝试过的评论:SetEnv allow true
和SetEnv allow 1
来消除对它是否是URL的怀疑,它仍然要求基本的授权密码,所以它可能与URL无关。
编辑2-添加整个.htaccess以确保我没有遗漏其他东西:
php_value max_input_vars 4000
RewriteEngine on
# Disallow other HTTP verbs such as PUT and DELETE
RewriteCond %{REQUEST_METHOD} !(^GET|^POST|^HEAD)
RewriteRule .* - [R=405,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(/img|/js|/css|/fonts|/twig|/pdf|/vendors|/server-status)
RewriteRule ^(.*)$ /boot.php
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ /boot.php
AddType font/ttf .ttf
AddType font/eot .eot
AddType font/otf .otf
AddType font/woff .woff
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/css text/javascript application/x-javascript application/javascript text/x-component text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon application/json font/woff font/otf font/eot font/ttf
</IfModule>
<ifModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 seconds"
ExpiresByType text/html "access plus 1 seconds"
ExpiresByType image/gif "access plus 2592000 seconds"
ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/png "access plus 2592000 seconds"
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType font/ttf "access plus 604800 seconds"
ExpiresByType font/eot "access plus 604800 seconds"
ExpiresByType font/otf "access plus 604800 seconds"
ExpiresByType font/woff "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 604800 seconds"
ExpiresByType application/x-javascript "access plus 604800 seconds"
</ifModule>
<ifModule mod_headers.c>
<filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=2592000, public, proxy-revalidate"
</filesMatch>
<filesMatch "\\.(js|css|ttf|eot|otf|woff)$">
Header set Cache-Control "max-age=604800, public, proxy-revalidate"
</filesMatch>
<filesMatch "\\.(xml|txt)$">
Header set Cache-Control "max-age=216000, public, must-revalidate"
</filesMatch>
</ifModule>
编辑3-对不起,应该提到我们现在被困在Apache 2.2上。
2条答案
按热度按时间webghufk1#
使用Apache 2.4+,您可以使用
<If>
表达式来禁用auth,或者使用THE_REQUEST
变量为URI使用allow from all
指令。THE_REQUEST
表示发送给Apache的原始请求,它不会在单个请求的上下文中更新:更新:这里有一个解决方案,适用于使用
<FilesMatch>
指令的Apache 2.2:fcipmucu2#
注意@anubhava的回复-它包含一个安全问题!
<If "%{THE_REQUEST} =~ /webhook/">
只检查请求是否 * 包含 * 字符串“/webhook/"。因此,通过将?uselessParameter=/webhook/
添加到您的请求中,您可以访问所有应受密码保护的私有资源!您可以使用
^
字符匹配THE_REQUEST
变量的开头。但这意味着你的正则表达式还必须包含HTTP动词。遗憾的是,似乎没有Apache参数包含实际的URI或实际的路径--至少我找不到。