如何在 laravel 5.2 中从 url 中删除 public
Posted
技术标签:
【中文标题】如何在 laravel 5.2 中从 url 中删除 public【英文标题】:How to remove public from url in laravel 5.2 【发布时间】:2019-05-09 20:27:58 【问题描述】:我在我的共享主机服务器中使用 Laravel 5.2。我想在不将 server.php 更改为根目录中的 index.php 的情况下从 url 中删除 public,因为这样做 .env 和其他文件是公开可见的。我的 .htaccess 如下所示:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,NC]
# Handle Front Controller...
RewriteCond %REQUEST_URI !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]
RewriteRule ^(css|js|images|media)/(.*)$ /public/$1/$2 [L,NC]
</IfModule>
【问题讨论】:
为什么不将域指向公共目录? 我该怎么做,这是唯一的选择吗? @KamalPaliwal 【参考方案1】:您需要从 cpanel 将您的域指向公共文件夹。
或
将您的 .htaccess 文件从 /public 目录移动到根目录,并将其内容替换为以下代码:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %REQUEST_FILENAME -d [OR]
RewriteCond %REQUEST_FILENAME -f
RewriteRule ^ ^$1 [N]
RewriteCond %REQUEST_URI (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ server.php
</IfModule>
【讨论】:
【参考方案2】:创建新的 .htaccess 文件在根目录 并粘贴以下代码
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %REQUEST_URI !^public
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
# php -- BEGIN cPanel-generated handler, do not edit
# Set the “ea-php56” package as the default “PHP” programming language.
<IfModule mime_module>
AddType application/x-httpd-ea-php56___lsphp .php .php5 .phtml
</IfModule>
# php -- END cPanel-generated handler, do not edit
【讨论】:
【参考方案3】:最好的解决方案是将您的 apache 文档根目录指向 laravel 的公用文件夹。 但正如您所说,您使用的是共享主机,那么可能对您来说是不可能的。
现在要在 URL 中不公开访问 laravel 应用程序,请遵循此问题 Laravel 5 - Remove public from URL
此外,您担心其他文件夹(如 app、config 等)无法从浏览器访问。因此,您可以放置一个.htaccess
在您要阻止浏览器访问的每个文件夹中包含内容 Deny from all
的文件。
【讨论】:
【参考方案4】:在根文件夹中制作 .htaccess 文件:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
【讨论】:
【参考方案5】:这是我找到的确切工作解决方案。解决方案来自here,由 Pallav Nagar 回答
在根目录中创建 .htaccess 文件并放置如下代码。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %REQUEST_FILENAME -d [OR]
RewriteCond %REQUEST_FILENAME -f
RewriteRule ^ ^$1 [N]
RewriteCond %REQUEST_URI (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ server.php
</IfModule>
【讨论】:
与检查的正确答案没有区别。以上是关于如何在 laravel 5.2 中从 url 中删除 public的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.2 Entrust:如果他手动添加受限URL,则重定向用户