Laravel 5 -从URL中删除公共

我知道这是一个非常流行的问题,但我还没有找到Laravel 5的有效解决方案。很长一段时间以来,我一直试图从Codeigniter迁移,但这个复杂的安装过程一直让我望而却步。

我不想运行一个虚拟机,这只是看起来尴尬时切换项目。

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

我已经尝试了.htaccess mod_rewrite方法

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

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

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

在开发环境中是否有一种合适的方法来删除“public”:

  1. 与L5一起工作
  2. 允许我轻松地在项目之间切换(我通常同时工作2或3个项目)。

谢谢

**我使用MAMP和PHP 5.6.2

346472 次浏览

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

2)如果你使用MAMP,那么你应该为每个项目创建新的vhosts,每个服务于该项目的公共目录。创建后,您可以通过定义的服务器名访问每个项目,如下所示:

http://project1.dev
http://project2.dev

可以在laravel5中删除公共 url。遵循以下步骤:

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

< p >步骤2。打开index.php文件 替换为< / p >
 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。

假设你将所有其他文件和目录放在一个名为“locale”的文件夹中。

enter image description here

到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';

Laravel 5:

  1. 将Laravel根文件夹中的server.php重命名为index.php
  2. .htaccess文件从/public目录复制到你的Laravel根目录 李文件夹。< / >

就是这样!

简单的方法从laravel 5 url删除公共。 你只需要从公共目录中剪切index.php和.htaccess,并将其粘贴到根目录,仅此而已 将index.php中的两行替换为

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';

请注意:上述方法只是初学者,因为他们可能会面临设置虚拟主机的问题,最好的解决方案是在本地机器上设置虚拟主机,并将其指向项目的公共目录。

@rimon。ekjon说:

将Laravel根文件夹中的server.php重命名为index.php,并将/public目录中的.htaccess文件复制到Laravel根文件夹中。——就是这样!!:)

这对我有用。 但是/public目录中的所有资源文件都找不到,请求url也不工作,因为我使用了asset() helper.

我修改了/Illuminate/Foundation/helpers.php/asset()函数如下:

function asset($path, $secure = null)
{
return app('url')->asset("public/".$path, $secure);
}

现在一切正常了:)

谢谢你@rimon。艾克乔恩和你们所有人。

2020年作者更新

不建议。 相反,建议处理.htaccess文件

我用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]
    

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

我想添加到@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, '/');
}

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

对于XAMPP用户来说,要在不接触laravel默认文件系统的情况下从url中删除public,需要为应用程序设置一个虚拟主机,只需遵循以下步骤即可

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

  2. 导航到C:/xampp/apache/conf/extra或任何你的XAMPP文件所在的地方。

  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>
  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>
  1. 接下来转到你的Windows主机文件编辑你的HOSTS。该文件将位于C:/Windows/System32/drivers/etc/hosts,其中hosts是文件。用记事本打开。
  2. 寻找在DNS本身中处理的#localhost名称解析。

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.
  1. 重新启动Apache并测试所有内容。

原文可以在在这里找到

< >强最好的方法: 我不建议删除public,而是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

遵循以下简单的步骤

  1. move所有文件从公共目录到根目录/laravel/
  2. 现在,不需要公共目录,所以你可以选择现在删除它
  3. 现在打开index.php并进行以下替换

需要DIR。“/ . . /引导/ autoload.php”;

需要DIR。“/引导/ 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/

我使用的另一种方法是在htdocs或www中使用ln命令创建一个符号链接(在Linux中,不知道Win),即ln projectname/public project 因此,站点可以通过localhost/project

访问

我以前读过一些文章,它工作得很好,但真的不知道是否安全

    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';

在Laravel设置中总是有一个公共文件夹的原因,所有与公共相关的东西都应该出现在公共文件夹中,

不要将你的ip地址/域名指向Laravel的根文件夹,而是指向公共文件夹。将服务器Ip指向根文件夹是不安全的。,因为除非你在.htaccess中写入限制,否则一个文件可以很容易地访问其他文件。

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

即使我不建议把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>

这是一个快速修复我必须使任何人都欢迎升级它。

只需在根目录下创建. htaccess文件,并将这些行添加到其中

<IfModule mod_rewrite.c>
RewriteEngine On


RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

就是这样!

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

如果你想将代码保存在子目录中,那么你可以创建一个子域,那么这段代码也可以用于该子目录。

Laravel 5.5

在第一次安装Laravel后,我面临着著名的“公共文件夹问题”,我想出了这个解决方案,在我的个人意见中,比我在网上找到的其他解决方案“更干净”。


成就

  • URI中没有public
  • 保护.env文件防止好奇的人

只要使用mod_rewrite和四个简单的规则编辑.htaccess就可以完成所有事情。


步骤

  1. 移动主根目录下public/.htaccess中的.htaccess文件
  2. 编辑如下

我评论了所有内容,所以(我希望)那些从未使用过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的解决方案,他的答案应该是可以接受的。只有一个简单而明确的规则,可以将所有流量重定向到公用文件夹,而无需修改任何文件。

在Laravel 5.5中,在根目录中创建. 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>
以下是截至2018年5月对我有效的最佳和最短的解决方案 对于Laravel 5.5

  1. 只需将你的.htaccess文件从/公共目录剪切到目录,并将其内容替换为以下代码:

    <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>
    
  2. Just save the .htaccess file and that is all.

  3. Rename your server.php file to index.php. that is all enjoy!

首先,您可以使用这些步骤

Laravel 5:

将Laravel根文件夹中的server.php重命名为index.php

2.从/public目录复制.htaccess文件到你的Laravel根文件夹。

来源:https://stackoverflow.com/a/28735930

在你遵循这些步骤之后,你需要改变所有的CSS和脚本路径,但这将是累人的。

解决方案建议:你可以简单地对helpers::asset函数做一些微小的改变。

对于这个:

  1. < p > vendor\laravel\framework\src\Illuminate\Foundation\helpers.php开放

  2. 转到第130行

  3. "public/".$path而不是$path

    function asset($path, $secure = null){
    return app('url')->asset("public/".$path, $secure);
    }
    


PLEASE NOTE当使用Docker服务Laravel项目时:你不需要做这些。只有当你的网站的根目录(或更常见的:public_html)是你的Laravel项目时才使用这个选项(当你使用Docker时不是这样)。

不!

将Laravel根文件夹中的server.php重命名为index.php 并将.htaccess文件从/public目录复制到你的Laravel根文件夹!!< / p >

这样每个人都可以访问你的一些文件(例如.env)。你自己试试。你不会想要的!


相反,你应该在根目录中创建一个.htaccess文件,如下所示:

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

这将无声地将所有基本uri重写到/public文件夹。甚至所有的(例如HTTP授权头)和所有可选的URI参数也会被默默地传递到/public文件夹中。

< p >
< br >

您可以使用各种方法从url中删除公共关键字。

1)如果你使用专用主机,你有根访问权限,那么你可以使用虚拟主机从url中删除公共关键字。你应该给DocumentRoot路径加上public。这会启动index from public directory并从url中移除它。

<VirtualHost *:80>
ServerAdmin info@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/{yoursourcedirectory}/public


ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2)如果你没有你的主机的根访问权限,那么你应该在你的根目录下生成一个新的。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>

你可以在这里得到更多参考

我找到了解决这个问题最有效的办法。

只需在文件夹中编辑你的.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>

目录中创建.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>

请将这些行添加到您的根.htaccess文件中,它隐藏了/public并重定向到所有没有public的url

RewriteEngine on
RewriteCond %{REQUEST_URI} !public/
RewriteRule (.*) /public/$1 [L]
<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(这是一个非常常见的用例),请使用

sudo nano /etc/apache2/sites-available/000-default.conf

在“DocumentRoot /var/www/html”下面添加以下行:

<Directory "/var/www/html">
AllowOverride All
</Directory>

重新启动服务器:

sudo service apache2 restart

4个最好的方法从URL删除公共。

如果您使用任何其他技巧从URL中删除公共,例如将server.php的名称更改为index.php,并更改为核心文件路径。显然,不要那样做。那为什么Laravel不给出这样的解呢因为这不是正确的方法。

1)在Laravel中使用htaccess从URL中删除公共

通过在根目录下添加一个。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)通过在本地创建虚拟主机来删除公共

我在这里演示的是windows操作系统。但我将尝试定义一个步骤,以便任何人都可以轻松地遵循该步骤。您还可以在谷歌上研究特定操作系统的相同内容。

步骤1:进入C:\Windows\system32\drivers\etc\以管理员模式打开“hosts”文件。

步骤2:添加以下代码。在这里,我给您演示projectname。本地域名演示,您可以指定任何您喜欢的。让每个地方都保持不变。

127.0.0.1  projectname.local

现在转到,xampp用户的C:\xampp\apache\conf\extra和wamp用户的"C:\wamp\bin\apache\Apache2.4.4\conf\extra"并打开"httpd-vhosts.conf"文件。现在将以下代码添加到其中。

< em >指出:根据您的项目更改文档根目录,并将您定义的域名添加到“hosts”文件中

<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>

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


3)在Laravel运行命令移除公众

如果你在本地工作,那么你不需要做任何事情,只需要从你的终端或命令行工具运行以下命令。在此之后,您可以通过命令行提供的URL访问您的网站。

   > php artisan serve

如果你想在特定的IP上运行你的项目,那么你需要运行以下命令。如果你在局域网工作,那么如果你想允许其他人从本地访问你的网站,那么你只需要在得到你的IP地址后,使用命令行通过运行“ipconfig”检查你的IP地址。

> php artisan serve --host=192.168.0.177

如果您希望在特定IP和特定端口上运行项目,则需要执行以下命令。

> php artisan serve --host=192.168.0.177 --port=77

4)删除托管服务器或cpanel上的公共

enter image description here

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

根据截图,如果你没有任何项目文件夹到public_html,那么你只需要设置你的文档根像"public_html/public"

引用自在这里

我在这里尝试了一些解决方案,发现htaccess适用于laravel 5.2,像这样:

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]

你不需要做太多,只需要在根目录上创建一个.htaccess文件,然后粘贴/保存下面的文件;

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

问题是如果你输入/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

添加。htaccess文件到你的根文件夹,粘贴下面的代码,用你自己的域名替换yourdomainname

< p > RewriteEngine 重写HTTP_HOST} ^(www.) ^/public/

. RewriteCond %{REQUEST_URI}

RewriteCond %{REQUEST_FILENAME} -d

. RewriteCond %{REQUEST_FILENAME}

RewriteRule ^(.*)$ /public/$1

RewriteCond %{HTTP_HOST} ^(www.) RewriteRule ^ (/) ?$ /public/index.php [L]

我知道这个问题有很多解决方案。最好和最简单的解决方案是在目录中添加. htaccess文件。

我尝试了我们为这个问题提供的答案,但我在Laravel中遇到了一些auth:api守卫的问题。

以下是最新的解决方案:

<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文件并添加以下代码。一切都很顺利

您可以先创建虚拟主机,然后在DocumentRoot中指定您的路径

例如:/var/www/html/YOUR_LARAVEL_DIRECTORY_PATH/public

https://github.com/dipeshsukhia/laravel-remove-public-url

你可以使用这个包

编译器需要dipeshsukhia/ laravell -remove-public-url——dev

php artisan vendor:publish——tag=LaravelRemovePublicUrl

在根目录中创建.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>

你只需要2个简单的步骤就可以做到

  1. 重命名laravel项目根目录下的server.php文件。

  2. 在根目录上创建一个.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]


在根目录下创建一个.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

在根项目文件夹中创建名为.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,你也应该在上面的代码中重命名它