我知道这是一个非常受欢迎的问题,但我还没有能够为Laravel 5找到一个可行的解决方案。我一直试图从Codeigniter迁移很长一段时间,但这个复杂的安装过程一直让我失望。
我不想运行虚拟机,这在项目之间切换时似乎很尴尬。
我不想将我的文档根目录设置为公共文件夹,这在项目之间切换时也很尴尬。
我已经尝试过.htaccess mod_rewrite方法
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
这只是在compile.php第7610行中给了我一个Laravel NotFoundHttpException。
我刚刚尝试L4时,我使用了将公用文件夹的内容移动到根目录的方法。 L5的结构完全不同,按照相同的步骤完全破坏了Laravel(服务器只返回一个空白页)。
是否有一种不错的方法可以删除公众&#39;在开发环境中:
由于
**我正在使用MAMP和PHP 5.6.2
答案 0 :(得分:379)
server.php
重命名为index.php
.htaccess
文件从/public
目录复制到Laravel根目录
文件夹中。那就是它!
答案 1 :(得分:109)
我用2个答案解决了这个问题:
将.htaccess改为静态,如下所示:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
如果还需要其他静态文件,只需将扩展名添加到之前声明的列表中
答案 2 :(得分:56)
在Laravel 5.5中,在根目录中创建.htacess文件并放置以下代码: - Reference Link
<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>
答案 3 :(得分:41)
从laravel 5网址中删除公众的简便方法。 您只需要从公共目录中剪切index.php和.htaccess并将其粘贴到根目录中,这就是全部 并将index.php中的两行替换为
require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
答案 4 :(得分:35)
@ rimon.ekjon说:
将Laravel根文件夹中的server.php重命名为index.php,并将.htaccess文件从/ public目录复制到Laravel根文件夹。 - 而已 !! :)
这对我有用。 但是/ public目录中的所有资源文件都找不到并且请求url不起作用,因为我使用了asset()帮助器。
我更改了/Illuminate/Foundation/helpers.php/asset()函数如下:
function asset($path, $secure = null)
{
return app('url')->asset("public/".$path, $secure);
}
现在一切正常:)
谢谢@ rimon.ekjon和你们所有人。
答案 5 :(得分:22)
1)我还没有找到一种在 L5 中移动公共目录的工作方法。虽然您可以修改引导程序index.php
中的某些内容,但是看起来有几个帮助程序函数基于该公共目录存在的假设。老实说,你真的不应该移动公共目录。
2)如果您使用 MAMP ,那么您应该为每个项目创建新的vhost,每个项目都是项目公共目录。创建后,您可以按照以下定义的服务器名称访问每个项目:
http://project1.dev
http://project2.dev
答案 6 :(得分:21)
只需在root上创建 .htaccess 文件并将这些行添加到其中
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
就是这样!
以上代码适用于root的public_html文件夹。说你的核心laravel文件应该在public_html文件夹中,如果你的目录看起来像public_html / laravelapp / public,如果你把上面的代码放在laravelapp中,它将无法工作。因此,您必须将所有核心文件复制到public_html中并将.htaccess文件放在那里。
如果您想将代码保存在子目录中,那么您可以创建一个子域,那么此代码也适用于此。
答案 7 :(得分:19)
您应该将Apache主机根目录指向$LARAVEL_PATH/public
目录而不是$LARAVEL_PATH
。
拥有www主机root而不是项目root的子目录是因为您没有通过Web服务器泄露任何项目文件。
即使所有PHP文件都有文件后缀.php
,恶意用户也可以访问您的$LARAVEL_PATH/storage
目录及其子目录内容,阅读composer.json
或package.json
以查找易受攻击的依赖项或读取.env
文件等。
如果您在共享主机上运行并且您具有强制public_html
,请尝试在该public_html
目录之外安装Laravel并删除public_html(如果为空)并将其替换为符号链接{{1或者,如果您希望Laravel实例是$LARAVEL_PATH/public
的子目录,请执行相同的操作,但要创建从public_html
到$LARAVEL_PATH/public
的符号链接。
该公共目录是有理由使项目更安全。解决实际问题,不要试图打破这个简单但很好的安全性添加。 :)
答案 8 :(得分:13)
可以在laravel5中删除公开网址。请按照以下步骤操作:
步骤1.从公开复制所有文件并粘贴在 root 目录
步骤2.打开index.php
文件
替换为
require __DIR__.'/../bootstrap/autoload.php';
到
require __DIR__.'/bootstrap/autoload.php';
和
$app = require_once __DIR__.'/../bootstrap/app.php';
到
$app = require_once __DIR__.'/bootstrap/app.php';
删除所有缓存和Cookie。
答案 9 :(得分:11)
您绝对不应将您Laravel根文件夹中的server.php
重命名为index.php
并将.htaccess
文件从/public
目录复制到您的Laravel根文件夹中!!
这样,每个人都可以访问您的某些文件(例如.env
)。自己尝试。你不要那个!
相反,应在根目录中创建一个.htaccess
文件,如下所示:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]
这将以静默方式将您的所有基本URI重写到/public
文件夹中。甚至HTTP:Authorization
和URI的参数都将以静默方式传递到/public
文件夹中。
就是这样!
答案 10 :(得分:10)
假设您将所有其他文件和目录放在名为“locale”的文件夹中。
转到index.php找到这两行:
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
并将其更改为:
require __DIR__.'/locale/bootstrap/autoload.php';
$app = require_once __DIR__.'/locale/bootstrap/app.php';
答案 11 :(得分:8)
最佳方法:
我不建议删除公开,而是on local computer create a virtual host point to public directory
和on remote hosting change public to public_html and point your domain to this directory
。原因,你的整个laravel代码将是安全的,因为它的一级到你的公共目录:)
我只需将server.php
重命名为index.php
即可使用
这适用于所有laravel版本...
这是我的目录结构,
/laravel/
... app
... bootstrap
... public
... etc
按照以下简单步骤
要求 DIR 。'/ .. / bootstrap / autoload.php';
到
要求 DIR 。'/ bootstrap / autoload.php';
和
$ app = require_once DIR 。'/ .. / bootstrap / start.php';
到
$ app = require_once DIR 。'/ bootstrap / start.php';
'public'=&gt;的 DIR 即可。 '/ .. /公共',
到
'public'=&gt;的 DIR 即可。 '/ ..',
就是这样,现在尝试http:// localhost / laravel /
答案 12 :(得分:7)
这是对我来说最好和最短的解决方案,可能是2018年的 对于Laravel 5.5
只需将您的.htaccess
文件从 / public 目录剪切到 root 目录,并使用以下代码替换它:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
</IfModule>
只需保存.htaccess
文件即可。
将您的server.php
文件重命名为index.php
。这都是享受!
答案 13 :(得分:6)
我想加入@Humble Learner并注意到#34; fix&#34;的正确位置。资产的url路径是/Illuminate/Routing/UrlGenerator.php/asset()。
更新方法以匹配:
public function asset($path, $secure = null)
{
if ($this->isValidUrl($path)) return $path;
$root = $this->getRootUrl($this->getScheme($secure));
return $this->removeIndex($root).'/public/'.trim($path, '/');
}
这将修复脚本,样式和图像路径。任何资产路径。
答案 14 :(得分:5)
对于XAMPP用户在不触及laravel默认文件系统的情况下从url中删除public是为您的应用程序设置虚拟主机以执行此操作jsut请按照以下步骤操作
打开XAMPP控制面板应用程序并停止Apache。请注意,较晚的Windows计算机可能将其作为服务运行,因此请选中Apache模块左侧的框。
导航至C:/xampp/apache/conf/extra
或XAMPP文件所在的位置。
使用文本编辑器打开名为httpd-vhosts.conf的文件。
在第19行附近找到#NameVirtualHost *:80
并取消注释或删除哈希值。
在文件的最底部粘贴以下代码:
<VirtualHost *>
ServerAdmin admin@localhost.com
DocumentRoot "C:/xampp/htdocs" # change this line with your htdocs folder
ServerName localhost
ServerAlias localhost
<Directory "C:/xampp/htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost eateryengine.dev>
ServerAdmin admin@localhost.com
DocumentRoot "C:/xampp/htdocs/eateryengine" # change this line with your htdocs folder
ServerName eateryengine.dev
ServerAlias eateryengine.dev
<Directory "C:/xampp/htdocs/eateryengine">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
C:/Windows/System32/drivers/etc/hosts
,其中hosts是文件。用记事本打开它。 127.0.0.1 localhost
127.0.0.1 localhost
127.0.0.1 eateryengine.dev #change to match your Virtual Host.
127.0.0.1 demo.eateryengine.dev #manually add new sub-domains.
可以找到原始文章here
答案 15 :(得分:4)
总是有理由在Laravel设置中有一个公共文件夹,所有公共相关的东西都应该出现在公共文件夹中,
请勿将您的IP地址/域指向Laravel的根文件夹,但将其指向公用文件夹。将服务器Ip指向根文件夹是不安全的,因为除非您在
.htaccess
中编写限制,否则可以轻松访问其他文件。
只需在.htaccess
文件中写入重写条件并安装重写模块并启用重写模块,在路由中添加公共的问题就会得到解决。
答案 16 :(得分:4)
在 root 目录中创建.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>
答案 17 :(得分:3)
在根目录中创建.htaccess文件,然后将代码放置如下。
<IfModule mod_rewrite.c>
#Session timeout
<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>
在/ public目录中创建.htaccess文件,然后将代码放置如下。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
答案 18 :(得分:2)
我之前看过一些文章并且它工作正常,但真的不知道是否安全
a. Create new folder local.
b. Move all project into the local folder expect public folder.
c. Move all the content of public folder to project root.
d. Delete the blank public folder
f. Edit the index file.
编辑index.php
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
到
require __DIR__.'/local/bootstrap/autoload.php';
$app = require_once __DIR__.'/local/bootstrap/app.php';
答案 19 :(得分:2)
从网址中删除公开内容的4种最佳方法。
如果您使用任何其他技巧从URL中删除了公众,例如将server.php的名称更改为index.php并更改为核心文件路径。显然,不要那样做。那为什么Laravel不提供这样的解决方案,因为这不是这样做的正确方法。
1)使用Laravel中的htaccess从URL中删除公共用户
通过在根目录中添加.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>
2)通过在本地创建虚拟主机来删除公共主机
我在这里为Window操作系统提供演示。但是,我将尝试定义一个步骤,以便任何人都可以轻松地遵循该步骤。您也可以针对特定的操作系统在google上进行搜索。
步骤1:转到C:\ Windows \ system32 \ drivers \ etc \以管理员模式打开“主机”文件。
步骤2:向其中添加以下代码。在这里,我为您演示了projectname.local域名演示,您可以随意指定。只需在每个位置使其恒定即可。
127.0.0.1 projectname.local
步骤3:现在,对于xampp用户和wamp用户C:\xampp\apache\conf\extra
,"C:\wamp\bin\apache\Apache2.4.4\conf\extra"
并打开"httpd-vhosts.conf"
文件。现在,将以下代码添加到其中。
注释: 根据项目更改文档根目录,还将定义的域名添加到“主机”文件中。 >
<VirtualHost projectname.local>
ServerAdmin projectname.local
DocumentRoot "C:/xampp/htdocs/projectdir"
ServerName projectname.local
ErrorLog "logs/projectname.local.log"
CustomLog "logs/projectname.local.log" common
</VirtualHost>
步骤4:最后但重要的一步是重新启动Xampp或Wamp并访问 http://projectname.local
之类的URL,Laravel会在没有公共URL的情况下进行响应。
3)通过在Laravel中运行命令来删除公共对象
如果您在本地工作,则无需执行任何操作,只需从终端或命令行工具运行以下命令即可。之后,您可以通过命令行通过提供的URL访问您的网站。
> php artisan serve
如果您想在特定IP上运行项目,则需要运行以下命令。如果您正在LAN上工作,那么如果要允许其他人从本地访问您的网站,则只需在使IP地址按照命令运行之后,通过运行“ ipconfig”来使用命令行检查IP地址即可。
> php artisan serve --host=192.168.0.177
如果您希望在具有特定端口的特定IP上运行项目,则需要执行以下命令。
> php artisan serve --host=192.168.0.177 --port=77
4)删除托管服务器或cpanel上的公共主机
项目完成后,您需要将项目托管在服务器上,然后只需将域中的文档根目录设置为公用文件夹。检查以下屏幕截图。
根据屏幕截图,如果您在public_html中没有任何项目文件夹,则只需将文档根目录设置为"public_html/public"
。
答案 20 :(得分:2)
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteRule ^(.*)$ public/$1 [L]
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
使用以下命令激活mod_rewrite模块
sudo a2enmod rewrite
并重新启动apache
sudo service apache2 restart
要从.htaccess文件中使用mod_rewrite(这是一种非常常见的用例),请使用编辑默认的VirtualHost
sudo nano /etc/apache2/sites-available/000-default.conf
在“ DocumentRoot / var / www / html”下方添加以下行:
<Directory "/var/www/html">
AllowOverride All
</Directory>
再次重新启动服务器:
sudo service apache2 restart
答案 21 :(得分:2)
首先,您可以使用以下步骤
对于Laravel 5:
1。。将Laravel根文件夹中的server.php重命名为index.php
2。将.htaccess文件从/ public目录复制到Laravel根文件夹。
来源:https://stackoverflow.com/a/28735930
按照这些步骤操作之后,您需要更改所有的CSS和脚本路径,但这会很累人。
解决方案提案:仅需对helpers::asset
函数进行少量更改即可。
为此:
打开vendor\laravel\framework\src\Illuminate\Foundation\helpers.php
转到第130行
写"public/".$path
而不是$path
function asset($path, $secure = null){
return app('url')->asset("public/".$path, $secure);
}
答案 22 :(得分:1)
在根项目文件夹中创建名为.htaccess
的新文件,并将以下代码放入其中:
<IfModule mod_rewrite.c>
#Session timeout
<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>
注意:如果您将server.php
更改为index.php
,则还应在上面的代码中对其重命名
答案 23 :(得分:1)
我知道很多解决此问题的方法。最好,最简单的解决方案是在 root 目录中添加 .htaccess 文件。
我尝试了为此问题提供的答案,但是在Laravel中使用auth:api Guard遇到了一些问题。
这是更新的解决方案:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
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>
在您的根目录中创建.htaccess文件,然后添加此代码。一切正常
答案 24 :(得分:1)
问题是,如果您键入/ public,它仍然可以在url中使用,因此我创建了一个修复程序,应将其放在public / index.php
中。 $uri = urldecode(
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);
if(stristr($uri, '/public/') == TRUE) {
if(file_exists(__DIR__.'/public'.$uri)){
}else{
$actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
$actual_link = str_replace('public/', '',$actual_link);
header("HTTP/1.0 404 Not Found");
header("Location: ".$actual_link."");
exit();
return false;
}}
这种和平的代码将从URL中删除public,并给出404,然后在没有public的情况下重定向到该URL
答案 25 :(得分:1)
即使我不建议将Laravel放在根文件夹上,也有一些情况无法避免; 对于那些情况,上述方法不适用于资产,所以我快速修复了htaccess: 将server.php复制到index.php后,编辑.htaccess文件,如下所示:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
### fix file rewrites on root path ###
#select file url
RewriteCond %{REQUEST_URI} ^(.*)$
#if file exists in /public/<filename>
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
#redirect to /public/<filename>
RewriteRule ^(.*)$ public/$1 [L]
###############
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
#RewriteCond %{REQUEST_FILENAME} -d # comment this rules or the user will read non-public file and folders!
#RewriteCond %{REQUEST_FILENAME} -f #
RewriteRule ^ index.php [L]
</IfModule>
这是我必须做的快速修复,所以欢迎任何人升级它。
答案 26 :(得分:1)
我使用的另一种方法是使用htdocs中的ln命令或www ln projectname/public project
创建符号链接(在Linux中,不要知道Win)
因此可以通过localhost / project
答案 27 :(得分:1)
在第一次安装Laravel之后,我遇到了着名的“公共文件夹问题”,我提出了这个解决方案,在我的个人意见中,“更清洁”,然后其他我在网上找到。
public
个字词
.env
文件免受好奇的人只需使用.htaccess
和四条简单规则修改mod_rewrite
即可完成所有工作。
.htaccess
文件移至主根<{li>中的public/.htaccess
我评论了所有内容,所以对于那些从未使用mod_rewrite
的人(我不是说我是专家,反之亦然)应该清楚(我希望)。另外,为了理解规则,必须清楚的是,在Laravel中,如果Bill连接到https://example.com
,则会加载https://example.com/index.php
。此文件只包含命令header("refresh: 5; https://example.com/public/")
,该命令将请求发送到https://example.com/public/index.php
。第二个index.php
负责加载控制器和其他东西。
# IfModule prevents the server error if the app is moved in an environment which doesn’t support mod_rewrite
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# RULES ORIGINALLY IN public/.htaccess ---
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# --- END
# PERSONAL RULES ---
# All the requests on port 80 are redirected on HTTPS
RewriteCond %{SERVER_PORT} ^80$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
# When .env file is requested, server redirects to 404
RewriteRule ^\.env$ - [R=404,L,NC]
# If the REQUEST_URI is empty (means: http://example.com), it loads /public/index.php
# N.B.: REQUEST_URI is *never* actually empty, it contains a slash that must be set as match as below
# .* means: anything can go here at least 0 times (= accepts any sequence of characters, including an empty string)
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*) /public/index.php [L]
# If the current request is asking for a REQUEST_FILENAME that:
# a) !== existent directory
# b) !== existent file
# => if URI !== css||js||images/whatever => server loads /public/index.php, which is responsible to load the app and the related controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(css|js|images|media)/(.*)$ /public/index.php [L,NC]
# If the current request is asking for a REQUEST_FILENAME that:
# a) !== existent directory
# b) !== existent file
# => if URI == css||js||images[=$1]/whatever[=$2] => server loads the resource at public/$1/$2
# If R flag is added, the server not only loads the resource at public/$1/$2 but redirects to it
# e.g.: bamboo.jpg resides in example.com/public/media/bamboo.jpg
# Client asks for example.com/media/bamboo.jpg
# Without R flag: the URI remains example.com/media/bamboo.jpg and loads the image
# With R flag: the server redirects the client to example.com/public/media/bamboo.jpg and loads the image
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(css|js|images|media)/(.*)$ /public/$1/$2 [L,NC]
# --- END
</IfModule>
可以删除以下规则(最初位于public/.htaccess
)。事实上,同样的规则在最后两条规则中以更详细的方式阐明。
# Handle Front Controller...
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteRule ^ index.php [L]
编辑:我错过了Abhinav Saraswat's solution,他的答案应该是公认的答案。只需一个简单明了的规则,可以将所有流量重定向到公用文件夹,而无需修改任何文件。
答案 28 :(得分:0)
您只需两个简单的步骤即可
在laravel项目的根目录中重命名server.php
文件。
在根目录上创建一个.htaccess
文件,并将以下代码粘贴到其中
Options -MultiViews -Indexes
RewriteEngine On
**#Handle Authorization Header**
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
**# Redirect Trailing Slashes If Not A Folder...**
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
#Handle Front Controller...
RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
答案 29 :(得分:0)
在您的根目录DIR中创建一个.htaccess文件,然后粘贴以下代码。就这样:P
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
答案 30 :(得分:0)
https://github.com/dipeshsukhia/laravel-remove-public-url
您可以使用此软件包
作曲家需要dipeshsukhia / laravel-remove-public-url --dev
php artisan vendor:publish --tag = LaravelRemovePublicUrl
答案 31 :(得分:0)
您可以先创建虚拟主机,然后在DocumentRoot中指定路径
示例:/var/www/html/YOUR_LARAVEL_DIRECTORY_PATH/public
答案 32 :(得分:0)
请将这些行添加到您的根htaccess文件夹中,该文件夹将完成此工作 在RewriteEngine上 RewriteCond%{REQUEST_URI}!public / RewriteRule(。*)/ public / $ 1 [L]
答案 33 :(得分:0)
将.htaccess文件添加到您的根文件夹,然后粘贴以下代码,并将您的域名替换为您自己的域名
RewriteEngine开启 RewriteCond%{HTTP_HOST} ^(www。)?您的域名$ RewriteCond%{REQUEST_URI}!^ / public /
RewriteCond%{REQUEST_FILENAME}!-f RewriteCond%{REQUEST_FILENAME}!-d
RewriteRule ^(。*)$ / public / $ 1
RewriteCond%{HTTP_HOST} ^(www。)?您的域名$ RewriteRule ^(/)?$ /public/index.php [L]
答案 34 :(得分:0)
您不需要做很多事情,只需在根目录上创建一个.htaccess文件,然后粘贴/保存以下内容;
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
答案 35 :(得分:0)
我在这里尝试了一些解决方案,并发现适用于laravel 5.2的htaccess,如下所示:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
RewriteRule ^.env - [F,L,NC]
RewriteRule ^app - [F,L,NC]
RewriteRule ^bootstrap - [F,L,NC]
RewriteRule ^config - [F,L,NC]
RewriteRule ^database - [F,L,NC]
RewriteRule ^resources - [F,L,NC]
RewriteRule ^vendor - [F,L,NC]
当您要禁止其他文件或文件夹时,只需添加
RewriteRule ^your_file - [F,L,NC]
答案 36 :(得分:0)
我找到了解决此问题最有效的方法。
只需在 root 文件夹中编辑.htaccess
并编写以下代码。没什么
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]
<IfModule php7_module>
php_flag display_errors Off
php_value max_execution_time 30
php_value max_input_time 60
php_value max_input_vars 1000
php_value memory_limit -1
php_value post_max_size 8M
php_value session.gc_maxlifetime 1440
php_value session.save_path "/var/cpanel/php/sessions/ea-php71"
php_value upload_max_filesize 2M
php_flag zlib.output_compression Off
</IfModule>
答案 37 :(得分:0)
您可以使用多种方法从网址中删除公共关键字。
1)如果您正在使用专用主机并且具有root访问权限,则可以使用Virtual Host从URL中删除public关键字。您应该给public提供DocumentRoot路径。因此,这将从公共目录开始索引,并将其从url中删除。
href
2)如果您没有主机的root访问权限,则应在根目录中添加一个新的.htaccess文件,并将代码如下所示
https://www.snopes.com/fact-check/canada-marijuana-federal-debt/
您可以在此处获得更多reference。
答案 38 :(得分:0)
第1步:
根目录中的server.php
文件重命名为index.php
第2步:将.htaccess
目录从/public
目录复制到根目录
答案 39 :(得分:0)
您只能执行以下两个步骤:
.htaccess
文件夹中剪切public
并粘贴到根(主文件夹)server.php
文件重命名为index.php
。 (主文件夹)