这些选项都不能真正解决我所寻找的问题。我最终做的是以下。我正在使用第三方Angular前端模板(来自ThemeForest的Angulr)以及数十万行代码和数百个不同文件。这些文件的很大一部分是样式表和通用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应用中捕获所有路由。请注意,中间件指定AUTH所以这些文件不会被返回到从存储目录的用户,除非用户已经验证:
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/.*');
保持目录结构“公共”和“存储/应用”之间非常相似使它非常容易组织哪些文件是敏感的,哪些不是,应用程序继续像以前那样运行,这次所有敏感内容都被未经授权的用户阻止。
这很接近,但我没有返回位于/ templates中的刀片模板。例如,我需要Laravel返回位于public/myApp/css/style.css中的文件。 js,html和其他文件存在类似的文件。我可以使用返回文件(“公共/ {...}”)或其他?我认为这会向浏览器返回一个下载请求。但是,这会起作用吗? –
默认情况下,任何拥有该文件绝对路径的人都可以公开使用公共文件夹中的所有内容。 他们的路径比Laravel路由具有更高的优先级。 对于静态文件的认证,你将不得不通过PHP服务它们,这是一个非常糟糕的做法,并且很慢。 我不会推荐它。而且,你的JS和CSS文件是公开的。如果你需要保护它们,那么你的架构可能有问题。 –
我用另一个解决方法更新了答案 –