我正在尝试找出对我服务器上的静态资产请求添加身份验证检查的最佳方法。
我正在运行 Apache2.4 和 PHP/Laravel,它通过直接从提供静态内容来运行DocumentRoot
并从进入来index.php
处理动态路由。
我一直在搜索并发现了几个选项,但我不确定最佳实践和最有效的共识是什么:
1) 在 Apache 中创建并设置一个 ActionHandler,以调用 CGI 脚本来提供静态内容。此脚本将为每个请求打开一个数据库连接,检查访问控制权限,并返回 301 或提供内容。我对此的想法是,由于为每个请求打开一个新的数据库连接,性能将受到巨大影响。
我尝试添加:
Action serve-static /var/www/file-server.py
AddHandler serve-static .js .css
到<Directory>
块,但这导致所有 css/js 返回 404。
mod_rewrite
2) 使用和的组合mod_proxy
将所有静态文件请求代理到另一台已打开数据库连接的应用服务器(或负载均衡到多台),执行身份验证检查并适当地提供文件。我对这种方法的担心是,我认为 Apache 可能会成为返回客户端的下行链路的瓶颈?
<Directory /var/www/html/app/public>
我从一个包含整个应用程序的块开始
我不太熟悉mod_rewrite
and mod_proxy
,所以我想我可以创建类似的东西
<Directory /var/www/html/app/public/static>
RewriteEngine on
RewriteRule "(.*)$" "http://fileserver/$1" [P]
ProxyPassReverse "/public/static" "http://fileserver/"
</Directory>
但我无法将其代理请求到文件服务器层甚至无法测试效率。
任何见解都将不胜感激!
答案1
如果静态内容已经在 Web 服务器上,请从简单开始。暂时跳过 CGI 脚本、代理、URL 重写和缓存。
在静态的 Directory 指令中,使用httpd 的身份验证模块锁定它。您暗示一个数据库连接,这意味着 mod_authn_dbd 和 mod_authz_dbm,并要求您的数据库具有模块支持的密码哈希。
您最终会需要缓存,每个文档的多个数据库查询性能不佳。Apache 实现是mod_authn_socache,它可以将身份验证填充到其共享对象缓存中,该缓存可以由共享内存、memcached 等支持。
您可以在 Web 应用程序的框架中执行类似的缓存。这对读者来说是一项练习,因为它比配置 Web 服务器更需要开发。