Laravel 5 - 从URL中删除公共

use*_*360 215 php .htaccess mamp laravel laravel-5

我知道这是一个非常受欢迎的问题,但我无法为Laravel 5找到一个可行的解决方案.我一直在尝试从Codeigniter迁移很长一段时间,但这个错综复杂的安装过程一直让我失望.

我不想运行VM,这在项目之间切换时似乎很尴尬.

我不想将我的文档根目录设置为公共文件夹,这在项目之间切换时也很尴尬.

我试过了.htaccess mod_rewrite方法

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)

这只是在compiled.php第7610行中给了我一个Laravel NotFoundHttpException.

当我不久前尝试L4时,我使用了将公用文件夹的内容移动到根目录的方法.L5的结构完全不同,按照相同的步骤完全打破了Laravel(服务器只返回一个空白页面).

在开发环境中是否有一种很好的方法可以删除"公共":

  1. 适用于L5
  2. 允许我轻松切换项目(我通常在任何时候工作2或3).

谢谢

**我正在使用MAMP和PHP 5.6.2

Asf*_*mim 405

对于Laravel 5:

  1. server.php在Laravel根文件夹中重命名为index.php
  2. .htaccess文件从/public目录复制到Laravel根文件夹.

而已!

  • 因为这可能是不安全的,所以如果你这样做,请确保没有人不能请求你的`.env`文件,除非你能用明文查看数据库密码的人;) (93认同)
  • 如果您使用来自root的相对路径引用您的资产,这将无效."/assets/styles.css"等等.我仍在努力寻找在服务器上部署它的最佳方法 (43认同)
  • 所有资产链接都不使用此方法 (12认同)
  • 请查看在根目录中仅创建 .htacess 文件的其他答案,因为此答案可能会暴露敏感信息(例如 .env 文件) (11认同)
  • 您的网站可供黑客使用,每个人都可以查看 .env 文件。 (8认同)
  • 这是不安全的。 (7认同)

ka_*_*lin 117

我用2个答案解决了这个问题:

  1. 将server.php重命名为index.php(无修改)
  2. 将.htaccess从公用文件夹复制到根文件夹(如下面的rimon.ekjon所述)
  3. 更改.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]
    
    Run Code Online (Sandbox Code Playgroud)

    如果需要任何其他静态文件,只需将扩展名添加到上一个声明的列表中

  • 嗯......试试`RewriteRule ^ .env - [F,L,NC]` (8认同)
  • 它正在工作,但css,js和图像没有加载 (6认同)
  • 恭喜,现在全世界都可以访问您应用程序的配置文件。 (3认同)
  • 或`&lt;Files〜“ \ .env $”&gt;允许订单,拒绝所有&lt;/ Files&gt;中的` (2认同)

Rah*_*ham 69

在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>
Run Code Online (Sandbox Code Playgroud)

  • 最好的答案!在我的示例中,只有一个工作,它肯定应该有更多的投票 (4认同)
  • 使用此代码时,存储链接不起作用. (3认同)
  • 这个规则`RewriteRule ^ ^$1 [N`] 有什么作用? (2认同)

Muh*_*diq 42

从laravel 5 url中删除公众的简便方法.你只需要从公共目录中删除index.php和.htaccess并将其粘贴到根目录中,这就是所有并将index.php中的两行替换为

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
Run Code Online (Sandbox Code Playgroud)

  • 您可以在加载时在 js 或 css 文件之前放置“public/”,例如 Html::script("public/js/....."); --但最好的解决方案是虚拟主机...... (2认同)

Mir*_*ron 37

@ 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);
}
Run Code Online (Sandbox Code Playgroud)

现在一切正常:)

谢谢@ rimon.ekjon和你们所有人.

  • 这不是解决此问题的好方法,因为您尝试在供应商目录中更新这不是一个好习惯. (2认同)

Der*_*man 37

别!

您真的不应该server.php在Laravel根文件夹中重命名index.php 并将其.htaccess/public目录复制到Laravel根文件夹中!!!

这样,每个人都可以访问您的某些文件(.env例如)。自己尝试。你不要那个!


相反,您应该.htaccess像这样在根目录中创建一个文件:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)

这将以静默方式将所有基本URI重写到该/public文件夹。甚至所有标(例如HTTP Authorization Header)和所有可选的URI参数也将无提示地传递到该/public文件夹。

就这样!

  • 它在生产中工作正常,但在本地不起作用有什么建议吗? (4认同)
  • 这是完美的工作!本地和服务器感谢安全帮助! (4认同)
  • 这个答案被低估了。赞成“大胆”并突出显示“不要”。它工作得非常好。 (3认同)
  • 完美的答案 (2认同)
  • @Tofandel _goal_ 不是“向公众公开不公开的内容”,而是从 URL 中删除“/public/”。实现这一目标的最简单和最共享的方法之一恰好是一种不安全的方法,人们倾向于做最简单/最常见的方法,因为他们不知道更好的方法。 (2认同)

Abh*_*wat 28

只需在root 创建.htaccess文件并将这些行添加到它

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)

而已!

上面的代码适用于root的public_html文件夹.说你的核心laravel文件应该在public_html文件夹中,如果你的目录看起来像public_html/laravelapp/public,如果你把上面的代码放在laravelapp中,它将无法工作.因此,您必须将所有核心文件复制到public_html中并将.htaccess文件放在那里.

如果要将代码保存在子目录中,则可以创建子域,然后此代码也适用于此.

  • 只想在这位绅士的作品之上添加一个简短的描述.上面的代码适用于root的public_html文件夹(我也有问题).说你的核心laravel文件应该在public_html文件夹中,我犯了一个错误,我的目录看起来像public_html/laravelapp/public如果你把上面的代码放在laravelapp里面就不行了.因此,您必须将所有核心文件复制到public_html中并将.htaccess文件放在那里.参考centOS和Cpanel托管laravel. (2认同)

Jer*_*fer 23

1)我还没有找到一种在L5中移动公共目录的工作方法.虽然你可以修改bootstrap中的一些东西index.php,但是看起来有几个辅助函数是基于公共目录存在的假设.老实说,你真的不应该移动公共目录.

2)如果您使用MAMP,那么您应该为每个项目创建新的vhost,每个项目都是项目公共目录.创建后,您可以按定义的服务器名称访问每个项目,如下所示:

http://project1.dev
http://project2.dev
Run Code Online (Sandbox Code Playgroud)


Pal*_*gar 16

.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>
Run Code Online (Sandbox Code Playgroud)

  • 我真的推荐这个解决方案。 (3认同)
  • 它工作正常,但仍然可以直接从 URL 访问 .env 文件。 (3认同)

小智 15

可以删除laravel5 中的公共 URL.跟着这些步骤:

步骤1.从公共中复制所有文件并粘贴到目录

步骤2.打开index.php文件替换

 require __DIR__.'/../bootstrap/autoload.php';
Run Code Online (Sandbox Code Playgroud)

 require __DIR__.'/bootstrap/autoload.php';
Run Code Online (Sandbox Code Playgroud)

$app = require_once __DIR__.'/../bootstrap/app.php';
Run Code Online (Sandbox Code Playgroud)

$app = require_once __DIR__.'/bootstrap/app.php';
Run Code Online (Sandbox Code Playgroud)

并删除所有缓存和cookie.


Ang*_*dor 11

假设您将所有其他文件和目录放在名为"locale"的文件夹中.

在此输入图像描述

只需转到index.php并找到以下两行:

require __DIR__.'/../bootstrap/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';
Run Code Online (Sandbox Code Playgroud)

并将它们改为:

require __DIR__.'/locale/bootstrap/autoload.php';

$app = require_once __DIR__.'/locale/bootstrap/app.php';
Run Code Online (Sandbox Code Playgroud)


Was*_* A. 10

最好的办法: 我会建议不要删除公众,而不是on local computer create a virtual host point to public directoryon remote hosting change public to public_html and point your domain to this directory.原因,你的整个laravel代码将是安全的,因为它的一级到你的公共目录:)

方法1:

我只是重新命名server.php,以index.php和它的工作原理

方法2:

这适用于所有laravel版本......

这是我的目录结构,

/laravel/
... app
... bootstrap
... public
... etc
Run Code Online (Sandbox Code Playgroud)

按照这些简单的步骤

  1. 将所有文件从公共目录移动到root/laravel /
  2. 现在,不需要公共目录,因此您可以选择立即删除它
  3. 现在打开index.php并进行以下替换

要求DIR.'/ ../bootstrap/autoload.php';

需要DIR.'/ bootstrap/autoload.php';

$ app = require_once DIR.'/ ../bootstrap/start.php';

$ app = require_once DIR.'/ bootstrap/start.php';

  1. 现在打开bootstrap/paths.php并更改公共目录路径:

'public'=> DIR.'/ ../public',

'public'=> DIR.'/ ..',

就是这样,现在尝试http:// localhost/laravel /


ton*_*pro 9

这是对我来说最好和最短的解决方案,对于我来说,2018年5月为Laravel 5.5

1-只需将.htaccess文件从/ public目录剪切到根目录,并使用以下代码替换它:

<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>
Run Code Online (Sandbox Code Playgroud)

2-只需保存.htaccess文件即可.

3-将server.php文件重命名 为index.php.这都是享受!


Sea*_*ins 7

我想补充一下@Humble Learner并注意到"修复"资产的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, '/');
}
Run Code Online (Sandbox Code Playgroud)

这将修复脚本,样式和图像路径.任何资产路径.


sun*_*yap 6

对于XAMPP用户而言,无需触摸laravel默认文件系统即可从网址中删除公共文件是为您的应用程序设置虚拟主机来执行此jsut,请按照以下步骤操作

  1. 打开XAMPP控制面板应用程序,然后停止Apache。请注意,较晚的Windows机器可能会将其作为服务运行,因此请选中Apache模块左侧的框。

  2. 导航到C:/xampp/apache/conf/extraXAMPP文件所在的位置。

  3. 使用文本编辑器打开名为httpd-vhosts.conf的文件。

  4. 在第19行附近找到#NameVirtualHost *:80并取消注释或删除哈希。

  5. 在文件的最底部粘贴以下代码:

<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>
Run Code Online (Sandbox Code Playgroud)
  1. 现在,您可以复制并粘贴下面的代码以添加虚拟主机目录。例如,我正在一个名为Eatery Engine的站点上工作,因此以下代码段将允许我在本地安装中使用子域:
<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>
Run Code Online (Sandbox Code Playgroud)
  1. 接下来转到Windows主机文件以编辑主机。该文件将位于C:/Windows/System32/drivers/etc/hosts,其中hosts是文件。用记事本打开它。
  2. 查找#localhost名称解析是在DNS本身内部处理的。

127.0.0.1 localhost

本地主机名称解析是在DNS本身内处理的。

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.
Run Code Online (Sandbox Code Playgroud)
  1. 重新启动Apache并测试所有内容。

原始文章可以在这里找到


May*_*iya 6

从网址中删除公开的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>
Run Code Online (Sandbox Code Playgroud)

2)通过在您的本地计算机上创建虚拟主机来删除公共主机

我在这里为Windows操作系统提供演示。但是,我将尝试定义一个步骤,以便任何人都可以轻松地遵循该步骤。您也可以针对特定的操作系统在Google上进行相同的研究。

步骤1:转到C:\ Windows \ system32 \ drivers \ etc \以管理员模式打开“主机”文件。

步骤2:向其中添加以下代码。在这里,我为您演示了projectname.local域名演示,您可以随意指定。只要使它在每个地方都恒定即可。

127.0.0.1  projectname.local
Run Code Online (Sandbox Code Playgroud)

步骤3:现在,C:\xampp\apache\conf\extra对于xampp用户和wamp用户"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>
Run Code Online (Sandbox Code Playgroud)

步骤4:最后但重要的一步是重新启动Xampp或Wamp并像那样访问url http://projectname.local,Laravel将在没有公共URL的情况下响应。


3)通过在Laravel中运行命令来删除公众

如果您在本地工作,则无需执行任何操作,仅需从终端或命令行工具运行以下命令。之后,您可以通过命令行通过提供的URL访问您的网站。

   > php artisan serve
Run Code Online (Sandbox Code Playgroud)

如果您愿意在特定IP上运行项目,则需要运行以下命令。如果您在LAN上工作,那么如果要允许其他人从本地访问您的网站,则只需在使IP地址按照命令运行之后,通过运行“ ipconfig”来使用命令行检查IP地址即可。

> php artisan serve --host=192.168.0.177
Run Code Online (Sandbox Code Playgroud)

如果您愿意在具有特定端口的特定IP上运行项目,则需要执行以下命令。

> php artisan serve --host=192.168.0.177 --port=77
Run Code Online (Sandbox Code Playgroud)

4)移除托管服务器或面板上的公共对象

在此处输入图片说明

项目完成后,您需要将项目托管在服务器上,然后只需将域上的文档根目录设置为公用文件夹。检查以下屏幕截图。

根据屏幕截图,如果您在public_html中没有任何项目文件夹,则只需将文档根目录设置为"public_html/public"


Rei*_*Sam 5

在Laravel设置中总是有一个公用文件夹的原因,所有与公用相关的资料都应存在于公用文件夹中,

不要将您的IP地址/域指向Laravel的根文件夹,而是将其指向公用文件夹。将服务器IP指向根文件夹是不安全的,因为除非您在中编写限制,否则.htaccess一个人可以轻松访问其他文件。

只需在.htaccess文件中写入重写条件并安装重写模块并启用重写模块,即可解决在路由中添加公用的问题。


Abd*_*leh 5

在根项目文件夹中创建名为的新文件.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>
Run Code Online (Sandbox Code Playgroud)

注意:如果您更改server.php为,index.php还应该在上面的代码中重命名它