我正在尝试部署我的Laravel应用并阻止对其他文件的访问,例如.env 我将所有的laravel应用程序放在www文件夹中,并添加了htaccess:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
但是当我转到域URL时,我拥有了所有文件..好像我的htaccess无法正常工作(他在Laravel应用的根目录上)
答案 0 :(得分:0)
这是仅使用放置在Laravel根目录中的.htaccess
文件的简单方法-例如与app
,bootstrap
,config
并排放置,...无需对代码进行任何更改。
该文件重写了所有请求,因此请求/file.png
实际上将返回/public/file.png
,而其他任何内容都将路由到/public/index.php
。这样还可以确保无法访问public
文件夹之外的任何内容,从而保护.env
或database/*
之类的敏感文件。
此方法假定DOCUMENT_ROOT
由您的Apache服务器正确设置。首先尝试此方法,仅在服务器上不起作用时才使用第二种方法。
.htaccess
RewriteEngine on
# serve existing files in the /public folder as if they were in /
RewriteCond %{DOCUMENT_ROOT}public%{REQUEST_URI} -f
RewriteRule (.+) /public/$1 [L]
# route everything else to /public/index.php
RewriteRule ^ /public/index.php [L]
如果服务器未正确设置DOCUMENT_ROOT,则需要在RewriteCond中使用绝对路径。也就是说,服务器文件系统上的绝对路径。您可以通过将以下脚本复制到Laravel安装所在的目录并访问其URL(即http://example.com/get_doc_root.php
)来获得它。
get_doc_root.php
<?php
echo getcwd();
这应该导致类似/var/www/example.com/web
的情况。使用以下.htaccess
文件,并将[[your path]]
替换为您得到的实际路径。
.htaccess
RewriteEngine on
# serve existing files in the /public folder as if they were in /
RewriteCond [[your path]]/public%{REQUEST_URI} -f
RewriteRule (.+) /public/$1 [L]
# route everything else to /public/index.php
RewriteRule ^ /public/index.php [L]
在我们的示例中,RewriteCond行如下所示:
RewriteCond /var/www/example.com/web/public%{REQUEST_URI} -f