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

How Can I Remove “public/index.php” in the URL Generated Laravel?

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

.htaccess

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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

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

我该如何改变?


选项1:使用.htaccess

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

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

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

现在,您应该可以访问没有" /public/index.php/"部分的网站。

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

在根目录中新建一个文件夹,然后移动除公用文件夹之外的所有文件和文件夹。您可以随便叫它。我将使用" laravel_code"。

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

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

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

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

并将它们更改为:

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

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

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

并将它们更改为:

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

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


我在Laravel 4.2上尝试过

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

我希望它能起作用


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

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

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

1
2
3
4
5
6
7
8
<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下使用

1
2
3
4
5
6
7
8
9
    # 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]


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

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

2:打开index.php并进行更改

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

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

1
$app = require_once __DIR__.'/../bootstrap/app.php';

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

这就对了。


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

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


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

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

In general, you should only use .htaccess files when you don't have
access to the main server configuration file. There is, for example, a
common misconception that user authentication should always be done in
.htaccess files, and, in more recent years, another misconception that
mod_rewrite directives must go in .htaccess files. This is simply not
the case. You can put user authentication configurations in the main
server configuration, and this is, in fact, the preferred way to do
things. Likewise, mod_rewrite directives work better, in many
respects, in the main server configuration.

... In general, use of .htaccess files should be avoided when
possible. Any configuration that you would consider putting in a
.htaccess file, can just as effectively be made in a
section in your main server configuration file.

Source: Apache documentation.

我之所以首先提到它,是因为如果可能的话,最好是完全摆脱.htaccess,并在VirtualHost标记内使用Directory标记。话虽这么说,其余的假设都是出于任何原因您都坚持使用.htaccess路由。

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

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

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

    1
    AllowOverride none

    1
    AllowOverride all

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

  • 是否启用了mod_rewrite?那可能是造成问题的原因。我注意到您在顶部处有标签。尝试注释掉这些标记,然后重新启动Apache。如果出现错误,则可能是因为您需要启用mod_rewrite
    如何为Apache 2.2启用mod_rewrite

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


    另外,请确保在编辑.htaccess文件后,"重写英语"功能已打开

    1
    sudo a2enmod rewrite

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

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

    • 转到您的公用文件夹,在其中编辑您的.htaccess文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    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的任何路由,则可以保护它。

    对于Laravel 4和5:

  • 将Laravel根文件夹中的server.php重命名为index.php
  • .htaccess文件从/public目录复制到Laravel根文件夹。
  • 而已 !! :)


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

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


    希望这对我有帮助。

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


    它有效且100%安全

    https://medium.com/@matteovirgilio/laravel-5-how-to-change-the-public-folder-and-secure-private-files-on-shared-hosting-a8e2e5b9b25f


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


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

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

    1
    $cp server.php index.php

    1
    2
    3
    4
    5
    6
     RewriteEngine on

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

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

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


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


    根据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 /