У меня есть веб-сайт, все страницы которого проходят через AWS Cloudfront (сейчас TTL равен 0).
Домен сайта - www.example.com, который является CNAME для облачного распространения. Затем Cloudfront запрашивает сайт с моего веб-сервера с origin.www.example.com, добавляя настраиваемый заголовок для аутентификации.
Однако теперь мне также нужно добавить на сайт базовую аутентификацию, пока он не будет запущен. Я пробовал это, используя LA-U: REMOTE_USER в RewriteCond
Эта конфигурация работает, но не имеет аутентификации:
<VirtualHost *:80>
ServerName www.example.com
ServerAlias www.example.com
ServerAdmin admin@site.com
DocumentRoot /var/www/www.example.com/trunk
<IfModule mpm_itk_module>
AssignUserId www_site www_site
</IfModule>
<LocationMatch "^(.*\.php)$">
ProxyPass fcgi://127.0.0.1:9154/var/www/www.example.com/trunk
</LocationMatch>
Alias "/robots.txt" "/var/www/norobots.txt"
<Directory /var/www/www.example.com>
RewriteEngine on
RewriteCond %{HTTP:X-PSK-Auth} !^mypassword$
RewriteRule .* - [F]
</Directory>
CustomLog /var/www/www.example.com/apachelogs/www.example.com-access.log combined
ErrorLog /var/www/www.example.com/apachelogs/www.example.com-error.log
</VirtualHost>
curl http://cxcglobal.demonow.website/
возвращает HTML-код сайта. Также
curl --header "X-PSK-Auth:mypassword" "http://cxcglobal.demonow.website/
возвращает исходный код сайта.
Однако, когда я изменяю конфигурацию на
<VirtualHost *:80>
ServerName www.example.com
ServerAlias origin.www.example.com
ServerAdmin jd@automatem.co.nz
DocumentRoot /var/www/www.example.com/trunk
<IfModule mpm_itk_module>
AssignUserId www_site www_site
</IfModule>
<LocationMatch "^(.*\.php)$">
ProxyPass fcgi://127.0.0.1:9154/var/www/www.example.com/trunk
</LocationMatch>
Alias "/robots.txt" "/var/www/norobots.txt"
<Directory /var/www/www.example.com>
RewriteEngine on
RewriteCond %{HTTP:X-PSK-Auth} !^mypassword$
RewriteRule .* - [F]
RewriteCond %{LA-U:WxLaRwvCQ2yAf5KJREMOTE_USER} !^$
RewriteRule ^/(.*) http://origin.www.example.com/$1 [P,L]
AuthUserFile /etc/apache2/staging.passwd
AuthType Basic
AuthName "Review security udpates"
Require valid-user
LogLevel alert rewrite:trace3
</Directory>
CustomLog /var/www/www.example.com/apachelogs/www.example.com-access.log combined
ErrorLog /var/www/www.example.com/apachelogs/www.example.com-error.log
</VirtualHost>
Я получаю сообщение об ошибке:
curl http://www.example.com/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested. Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
<hr>
<address>Apache/2.4.18 (Ubuntu) Server at origin.www.example.com Port 80</address>
</body></html>
для обоих запросов curl. У меня нет ошибок ни в журнале ошибок конкретного сайта, ни в глобальном журнале ошибок apache. Я также не могу найти никаких записей для журнала перезаписи.
Лучшим способом может быть использование лямбда для обработки аутентификации непосредственно в облаке ...
Сам не пробовал, но нашел этот ресурс ...
http://engineering.widen.com/blog/AWS-CloudFront-User-Authentication-using-Lambda@Edge/
Кажется, это относительно просто. Lambda @ Edge позволяет запускать код для проверки и изменения входящих запросов.