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

时间:2014-05-23 20:33:01

标签: php .htaccess laravel laravel-4 laravel-routing

我需要从Laravel中生成的网址中删除index.phppublic/index.php;通常路径为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.php

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

我该如何改变?

19 个答案:

答案 0 :(得分:113)

选项1:使用.htaccess

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

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

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

现在您应该可以在没有&#34; /public/index.php /&#34;的情况下访问该网站;一部分。

选项2:移动&#39; / public&#39;目录到根目录

在根目录中创建一个新文件夹,并移动除公用文件夹以外的所有文件和文件夹。您可以随意调用它。我将使用&#34; laravel_code&#34;。

接下来,将所有内容移出公共目录并移至根文件夹。它应该导致与此类似的东西: enter image description here

之后,我们所要做的就是编辑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';

来源:How to remove /public/ from URL in Laravel

答案 1 :(得分:38)

我在Laravel 4.2上试过这个

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

我希望它有效

答案 2 :(得分:12)

这里是删除公共网址的简单步骤(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

就是这样。

答案 3 :(得分:11)

请勿与其他选项混淆我正在使用的下面的代码段,对您也很有用。 将以下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]

答案 4 :(得分: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而不是RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?/$1 [L] 。 [因此公用文件夹名称将被隐藏]
3)然后创建一个.htaccess,它将隐藏你的url中的index.php,该url应位于根目录(公共文件夹)中

{{1}}

答案 5 :(得分:5)

这可能与Laravel没什么关系,而且与你的Apache配置有关。

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

  

通常,您应该只在没有时使用.htaccess文件   访问主服务器配置文件。例如,有一个   常见的误解,即用户身份验证应始终在其中完成   .htaccess文件,并且,在最近几年,另一个误解   mod_rewrite指令必须放在.htaccess文件中。这根本不是   案子。您可以将用户身份验证配置放在main中   服务器配置,这实际上是首选方式   的东西。同样,mod_rewrite指令在许多方面更好用   尊重,在主服务器配置中。

     

...一般情况下,应避免使用.htaccess文件   可能。您考虑放入的任何配置   .htaccess文件,可以同样有效地制作   主服务器配置文件中的部分。

     

来源:Apache documentation

我之所以提到这一点,是因为如果可以的话,最好完全摆脱.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_rewriteHow to enable mod_rewrite for Apache 2.2

  4. 希望这会有所帮助。我已经列出了一些最常见的问题,但还有其他一些问题可能更平凡或更独特。关于开发服务器的另一个建议?重新安装Apache。如果可能的话,请使用一个好的教程从不同的来源这样做。

答案 6 :(得分:1)

Laravel已经发布了漂亮的网址.htaccess ......你应该开箱即用...... http://laravel.com/docs/installation#pretty-urls

确保已启用mod_rewrite,并且您的主路径已设置为应用程序的公共目录。

答案 7 :(得分:1)

对于Laravel 4&amp; 5:

  1. 将Laravel根文件夹中的server.php重命名为index.php
  2. .htaccess目录从/public目录复制到Laravel 根文件夹
  3. 就是这样! :)

答案 8 :(得分:0)

请注意

使用 Docker 为 Laravel 项目提供服务时:您不需要执行任何这些操作。仅当您网站的根目录(或更常见的是:public_html)是您的 Laravel 项目时才使用此选项(当您使用 Docker 时,情况并非如此)。

不要!

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

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

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

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

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

就这些

答案 9 :(得分: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]

答案 10 :(得分:0)

答案 11 :(得分:0)

还要确保在编辑.htaccess文件后打开了重写Engline

sudo a2enmod rewrite

答案 12 :(得分:0)

您必须执行以下步骤来做到这一点,

  • 将您的域映射到项目的公用文件夹(即/ 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即可直接访问任何路由,则会对此加以保护。

答案 13 :(得分:0)

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

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

$cp server.php index.php

答案 14 :(得分:0)

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

答案 15 :(得分:0)

希望这对我有帮助。

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

答案 16 :(得分:0)

 RewriteEngine on

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

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

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

答案 17 :(得分:-2)

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

答案 18 :(得分:-3)

根据 Laravel 5.3 ,上述内容无法正常运行,但请保持冷静并按照以下步骤操作:

步骤1.进入laravel项目内部 步骤2.制作一个随机目录/文件夹,例如。 laravelcode
步骤3.移动所有文件夹和文件(公共文件夹除外)
步骤4.将 public 文件夹中的所有文件夹和文件移动到laravel项目
步骤5.现在在laravel项目中有index.php文件,请打开它并按照新路径更改bootstrap的文件夹路径,就像之前的“require DIR 。”/ .. / bootstrap一样/autoload.php“;”现在它将成为“要求 DIR 。”/ laravelcode / bootstrap / autoload.php';“

这只是运行你的url而没有public和index.php,如下所示 http://localhost/blog/