如何在URL生成的Laravel中删除“ public / index.php”?


90

我需要从Laravel中删除 index.phppublic/index.php从生成的URL中删除;通常路径是localhost/public/index.php/someWordForRoute,它应该是这样的localhost/someWordForRoute.

.htaccess

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

RewriteEngine On

# Redirect Trailing Slashes.
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php[L]

app / config / app.php

'url' => 'http://localhost',

我该如何改变?


7
Laravel中的漂亮URL。确保mod_rewrite已启用。
Kryten 2014年


@Kryten不起作用= /
TuGordoBello 2014年

2
当其他解决方案不起作用时,这就是解决方案dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello 2014年

您的文档根目录是否指向目标文件夹,即/var/www/project_name/public
Kiee 2014年

Answers:


129

选项1:使用.htaccess

如果尚不存在,请在Laravel根目录中创建一个.htaccess文件。.htaccess如果您的Laravel根目录尚不存在,请创建一个文件。(通常在您的public_html文件夹下)

编辑.htaccess文件,使其包含以下代码:

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

现在,您应该可以不用“ /public/index.php/”部分访问该网站。

选项2:将“ / public”目录中的内容移至根目录

在根目录中新建一个文件夹,然后移动除公用文件夹之外的所有文件和文件夹。您可以随意命名。我将使用“ laravel_code”。

接下来,将所有内容移出公共目录并移至根文件夹。它应该导致类似于以下内容: 在此处输入图片说明

之后,我们要做的就是编辑laravel_code/bootstrap/paths.php文件和index.php文件中的位置。

laravel_code/bootstrap/paths.php找到以下代码行:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../public',

并将它们更改为:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../../',

在中index.php,找到以下行:

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

并将它们更改为:

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

来源:如何从Laravel中的URL删除/ public /


5
如果您使用的是Debian Linux,请不要忘记将etc/apache2/apache2.conf更改从更改AllowOverride NoneAllowOverride All您看到的目录配置<Directory /var/www/></Directory>
罗宾汉2015年

1
我只需要将.htaccess文件放到我的根目录下就可以正常工作。
马里奥·罗德里格斯

8
在生产模式下,移至/ root根本不是一个好建议!公用文件夹存在是有原因的
toesslab 2015年

为确保重写规则正常工作,请检查apache配置<Directory ...是否具有AllowOverride All'以下内容: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri-inkalimeva 2015年

如果我没有托管访问权限怎么办?
彼得

40

我在Laravel 4.2上尝试过

重命名server.php您的Laravel根文件夹中的index.php,并将.htaccess文件从/public目录复制到Laravel根文件夹。

我希望它能起作用


1
如果Luazan接受的答案不起作用,那么就足够了。尽管我会确保在公共文件夹中编辑index.php文件,以便在用户直接转到该链接时将他们重定向到公共目录之外。
布莱德·伯德

4
不再从公共文件夹中加载js和css文件
llioor

@MaHDyfo-为什么它不安全?如何 ?
1291年

2
@ 151291,因为每个人都可以访问.env文件,因此这种方式访问​​您的网站。除非您保护Web服务器安全以避免这种情况。
Mahdyfo

17

不要将我正在使用的以下代码片段与其他选项混淆,这对您也将很有用。将以下htacces放在您的根目录中。

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

转到您的公共目录,然后在下面的代码段中放入另一个htaccess文件

<IfModule mod_rewrite.c>
    RewriteEngine On
    # Removes index.php from ExpressionEngine URLs  
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]

</IfModule>

它的工作...!

Laravel在.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]

太好了:您能告诉我这种方法的优缺点吗?
穆罕默德·阿迪克

我只在根目录(您的第一个片段)中编辑了.htaccess,为我修复了它,谢谢!
peird

13

删除URL中的公共内容的简单步骤(Laravel 5)

1:从公用文件夹复制所有文件,并将其粘贴到laravel根文件夹中

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

在Laravel 4中,路径2$app = require_once __DIR__.'/bootstrap/start.php';代替$app = require_once __DIR__.'/bootstrap/app.php';/app.php

这就对了。


关于网站上的其他链接是否还有其他复杂之处?
Haring10年

这看起来是一个很好的解决方案,也很简单。但是确实如此,正如Haring10所说。这有什么问题吗?
彼得

10

1)检查是否启用了mod_rewrite。转到/etc/apache2/mods-enabled目录,查看是否rewrite.load可用。如果没有,请使用命令启用它sudo a2enmod rewrite。它将启用重写模块。如果已启用,它将显示消息Module rewrite already enabled
2)为公共目录创建一个虚拟主机,这样http://localhost/public/index.php我们就可以像使用它一样使用http://example.com/index.php。[因此
将隐藏公用文件夹名称] 3)然后创建一个.htaccess文件,该文件将在您的url中隐藏index.php,该URL应该位于根目录(公用文件夹)内

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]

1
尝试了您的步骤。还没有结果!我不明白为什么会这样!
Mostafiz Rahman 2014年

提供日志信息,以便我们可以找到根本原因
Orchid 2014年


为我工作。不要使虚拟主机直接进入公用文件夹。
cardi777

谢谢。这对我有用,我mod_rewrite被禁用了。
Maubeh '16

5

这可能与Laravel无关,而与您的Apache配置无关。

您可以访问Apache服务器配置吗?如果是这样,请从文档中进行检查:

通常,仅在无权访问主服务器配置文件时才应使用.htaccess文件。例如,存在一个普遍的误解,即用户身份验证应始终在.htaccess文件中进行,而在最近几年,又出现了另一个误解,即mod_rewrite指令必须在.htaccess文件中进行。这根本不是那么回事。您可以将用户身份验证配置放在主服务器配置中,实际上,这是首选的处理方式。同样,在许多方面,mod_rewrite指令在主服务器配置中效果更好。

...通常,应尽可能避免使用.htaccess文件。您可以考虑在.htaccess文件中进行的任何配置,都可以在主服务器配置文件中的某个部分中进行同样有效的配置。

资料来源:Apache文档

我之所以首先提到这一点,是因为.htaccess如果可能的话,最好是完全摆脱掉,并在Directory标签内使用VirtualHost标签。话虽这么说,剩下的一切将假设您.htaccess出于任何原因都坚持使用这条路线。

为了解决这个问题,可能会发生一些事情:

  1. 我注意到,也许毫无意义地.htacces在您的问题中命名了您的文件。我的猜测是这是一个错字,但您偶然忽略了它,而实际上只是错过了第二个s,这恰恰是一种小错误,会让我把头撞在墙上,寻找更具挑战性的东西。

  2. 您的服务器无法允许.htaccess。要检查这一点,请转到您的Apache配置文件。在现代的Apache构建中,该文件通常不在一个配置文件中,因此请确保使用的文件指向您的应用程序(无论存在于何处)。更改

    AllowOverride none
    

    AllowOverride all
    

    作为后续,Apache文档还建议出于安全目的,如果要.htaccess进行重写,请不要对每个文件夹都这样做。而是对需要添加.htaccess到的文件夹执行此操作。

  3. mod_rewrite启用了吗?那可能是造成问题的原因。我注意到您的标签位于顶部<IfModule mod_rewrite.c>。尝试注释掉这些标记,然后重新启动Apache。如果出现错误,则可能是因为您需要启用mod_rewrite如何为Apache 2.2启用mod_rewrite

希望这可以帮助。我已经列出了一些最常见的问题,但还有其他一些可能更为平凡或独特。开发服务器上的另一个建议?重新安装Apache。如果可能的话,请从其他来源获得良好的教程。


apache2配置设置非常有用,我每次都会错过此设置。
Abhishek



1

Laravel已经附带了一个漂亮的URL .htaccess ...您应该可以直接使用... http://laravel.com/docs/installation#pretty-urls

确保启用了mod_rewrite并将主路径设置为应用程序的公共目录。


我激活mod_rewrite并复制了该页面上的代码,但仍然无法正常工作
TuGordoBello 2014年

1
确保在Apache中将您的路径设置为应用程序的公用文件夹。
Kisuka 2014年

ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello 2014年

您启用mod_rewrite后是否重新启动了apache?
Kisuka

我有一个文件夹,user是存放照片的地方,也有一个刀片文件user,当我在URLmyproject.com/user中写入内容时,会向我显示该文件夹的内容,即图片
TuGordoBello 2014年

1

您必须执行以下步骤来执行此操作,如下所示

  • 将您的域映射到项目的公用文件夹(即/ var / www / html / yourproject / public)(如果使用linux)

  • 转到您的公用文件夹在.htaccess此处编辑文件

AddHandler application/x-httpd-php72 .php
<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 non-www to www
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Redirect non-http to https
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

    # Remove index.php
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
</IfModule>


  • 最后三个规则适用于如果您直接访问不带的任何路由https,则可以保护它。

0
 RewriteEngine on

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d

 RewriteRule ^(.*)$ index.php/$1 [L]

在.htaccess中使用它并重新启动服务器


0

希望这对我有帮助。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

0

我刚刚为项目安装了Laravel 5,并且在根目录中有一个名为的文件server.php

更改为index.php,它可以工作或输入终端:

$cp server.php index.php

0

重命名server.php您的Laravel根文件夹中的index.php,并将.htaccess文件从/public目录复制到Laravel根文件夹。



0

如果您使用IIS Windows Server,请web.config在根文件夹中添加文件,然后输入以下代码:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="^system.*" ignoreCase="false" />
                    </conditions>
                    <action type="Rewrite" url="/index.php/{R:1}" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{R:1}" pattern="^(index\.php|images|robots\.txt|css)" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

如果使用,请.htaccess 使用以下一项:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

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

3
为您的解决方案提供更多说明
Naruto 2014年

-3

根据Laravel 5.3,上述操作将无法正常进行,但是请保持冷静并遵循以下步骤:

步骤1.进入laravel项目内部。
步骤2.随机创建一个目录/文件夹,例如。laravelcode
步骤3.将所有文件夹和文件(除了公共文件夹)
4步。将所有这些都是里面的文件夹和文件的公共文件夹复制到laravel项目
第5步:现在laravel项目有index.php文件里面,请打开该目录,然后按照新路径更改引导程序的文件夹路径,就像以前的“需要DIR。'/ .. / bootstrap / autoload.php';”一样。现在它将变成“需要DIR。'/ laravelcode / bootstrap / autoload.php';”

就是这样,不带public和index.php即可运行您的网址,例如 http:// localhost / blog /

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.