好的,这是我的答案——最好的答案是“不”。但是 images/js/css 在开发中相对重要(在上线之前公开),并且客户端预览表明我们不能执行基于 IP 的 apache 规则。所以,规则(从上面,稍微修改)是
RewriteEngine On
# Exclude the public and error directories from authentication
RewriteRule ^(public|error)($|/) - [L]
# Perform authentication via php
RewriteCond %{REQUEST_FILENAME} !auth.php
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* auth.php?requested_file=$0 [QSA,L]
(因为我需要一些内容确实公开的子目录,请阅读:登录页面上使用的 images/css/js)
相关的php如下;为了
if($authenticated){
if($extension == 'php'){
call_user_func(function(){
$file_name = func_get_arg(0);
$path = getcwd();
chdir(pathinfo($file_name,PATHINFO_DIRNAME));
return include($file_name);
chdir($path);
}, $file_name);
} else {
//set cache headers so the browsers don't have to refresh all the
// static content
header_remove('X-Powered-By');
header_remove('Transfer-Encoding');
header_remove('Cache-Control');
header_remove('Pragma');
header_remove('Expires');
//header('Expires:');
header('Content-type: '.$mime_type);
readfile($file_name);
}
}
它的作用是执行 php usingcall_user_func()
以停止命名空间污染,include()
执行 PHP,并chdir()
确保脚本获得正确的当前工作目录。
那是“容易”的部分;内容标题和 mime 类型必须“猜测”(我使用 finfo 作为 mime 类型,但它在 2013 年有一个错误,这只会加剧问题)但即使是 apache 也不能 100% 正确地做到这一点...
然后删除图像的缓存控制标头,否则您不仅会经常成为 php 页面...
可以说;如果你有粗管道和很多你不需要的 CPU 周期,你只需要这样做......