这些选项都没有真正解决我正在寻找的东西。我最终做的是以下。我正在使用具有数十万行代码和数百个不同文件的第 3 方 Angular 前端模板(来自 ThemeForest 的 Angular)。这些文件中有很大一部分是样式表和通用 JavaScript 库(Angular、JQuery 等)。我不介意将这些内容放入公共文件夹并将文件提供给未经身份验证的用户。
但是,我文件的另一部分是修改后的文件。例如,一个文件具有导航元素,这些元素几乎布局了我的专有业务系统的整个格式,并说明了很多关于业务的内部操作。因此,像导航 html、css 和 js 这样简单的东西是敏感的,应该只提供给经过身份验证的用户。
我所做的是将公共内容和受保护内容拆分为相同(或至少相似)的目录树,其中一个位于 /public/*,另一个位于 /storage/app/*。我所有的非敏感内容(主要是模板样式表和通用 JS 库)都在“公共”树中,而敏感内容在我的“存储/应用”树中。比如:
- public
--- js
----- someThirdPartyJavaScript.js
----- loginController.js (unprotected)
----- ...
--- libs
----- angular.js
----- jquery.js
----- ...
--- css
----- unprotectedStyleSheet.css
----- ...
--- tpl
----- loginTemplate.html
- storage (all protected content goes in this tree)
--- app
----- js
------- myApp.js
------- directives
--------- myCustomDirective.js
--------- businessNavigationDirective.js (sensitive and proprietary)
----- css (for protected css files)
----- libs (for protected libs)
----- tpl (for protected .html files)
------- clientInformationSheet.html (sensitive content indicating the structure of our customer data)
在 .htaccess 中,我使用以下规则基本上返回公共树中存在的任何文件:
# If the file exists in laravel/public and the URI does not specify ".php" then go get it.
RewriteCond %{DOCUMENT_ROOT}/laravel/public/%{REQUEST_URI} -f
RewriteCond %{REQUEST_URI} !^.*\.php$
RewriteRule ^(.*)$ laravel/public/$1 [L]
.htaccess 发送所有其他请求由 Laravel index.php 处理
然后,我创建了一个 Laravel 5.2 路由来捕获我的 Angular 应用程序中的所有路由。请注意,中间件指定了身份验证,因此除非用户已通过身份验证,否则这些文件不会从存储目录返回给用户:
use League\Flysystem\Util\MimeType as MimeType;
Route::any('/{any}', ['middleware' => 'auth', function($uri){
// Auth::logout();
$uri = storage_path('app/' . $uri);
if (!File::exists($uri)){
return "Path not found.";
}
$extension = File::extension($uri);
if (array_key_exists($extension, MimeType::getExtensionToMimeTypeMap())){
$mimeType = MimeType::getExtensionToMimeTypeMap()[$extension];
} else {
$mimeType = "text/plain";
}
return response(File::get($uri))
->header('Content-Type', $mimeType);
}])->where('any', '^MySuperCoolApplicationSubDirectory/.*');
保持“public”和“storage/app”之间的目录结构非常相似,可以很容易地组织哪些文件是敏感文件,哪些不是,并且应用程序继续像以前一样运行,这一次所有敏感内容都被保存阻止未经身份验证的用户。