【问题标题】:How Can I Remove “public/index.php” in the URL Generated Laravel?如何删除 URL Generated Laravel 中的“public/index.php”?
【发布时间】:2014-07-13 07:51:06
【问题描述】:

我需要从 Laravel 生成的 URL 中删除 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/config/app.php

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

我该如何改变呢?

【问题讨论】:

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


【解决方案1】:

选项 1:使用 .htaccess

如果还没有,请在 Laravel 根目录中创建一个 .htaccess 文件。 如果您的 Laravel 根目录不存在,请创建一个 .htaccess 文件。 (通常在您的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';

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

【讨论】:

  • 如果您使用 Debian Linux,请不要忘记编辑 etc/apache2/apache2.conf,将 AllowOverride None 更改为 AllowOverride All,您会看到目录配置 &lt;Directory /var/www/&gt;&lt;/Directory&gt;
  • 我只需要将 .htaccess 文件放到我的根目录中即可使其正常工作。
  • 在生产模式下移动到 /root 根本不是一个好建议!公共文件夹存在是有原因的
  • 为了确保重写规则工作检查 apache 配置 &lt;Directory ... 配置有 AllowOverride All' 这样的东西:&lt;Directory "/var/www/html/laravel/public"&gt; Options Indexes FollowSymLinks MultiViews **AllowOverride All** &lt;/Directory&gt;
  • 如果我在主机上没有 conf 访问权限怎么办?
【解决方案2】:

我在 Laravel 4.2 上试过这个

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

我希望它有效

【讨论】:

  • 如果 Luazan 接受的答案不起作用,那么这就足够了。虽然我会确保编辑公共文件夹中的 index.php 文件,以便在用户直接访问该链接时将其重定向到公共文件夹之外。
  • 不再从公共文件夹加载 js 和 css 文件
  • @MaHDyfo - 为什么它不安全?以及如何?
  • @151291 因为每个人都可以通过这种方式访问​​您的站点的 .env 文件。除非您保护您的网络服务器以避免这种情况。
【解决方案3】:

不要与我正在使用的下面的 sn-p 的其他选项混淆,它也对你有用。 将以下 htacces 放入您的根目录中。

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

转到你的公共目录,并在下面放另一个带有代码 sn-p 的 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(你的第一个 sn-p),并为我修复了它,谢谢!
【解决方案4】:

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

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

【讨论】:

  • 试过你的步骤。还没有结果!我不知道为什么会这样!
  • 提供日志信息以便我们追查根本原因
  • 这里是完整的日志文件:dropbox.com/s/8fhlbej86nqr5qj/laravel.log?dl=0
  • 为我工作。不要让虚拟主机直接进入公用文件夹。
  • 谢谢。这对我有用,我的 mod_rewrite 被禁用了。
【解决方案5】:

以下是删除 URL 中的 PUBLIC 的简单步骤 (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 所说。这有什么问题吗?
【解决方案6】:

对于 Laravel 4 和 5:

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

就是这样!! :)

【讨论】:

    【解决方案7】:

    这可能与 Laravel 几乎没有关系,而与您的 Apache 配置有关。

    您有权访问您的 Apache 服务器配置吗?如果是这样,请从文档中查看:

    一般来说,您应该只在没有 .htaccess 文件时使用 访问主服务器配置文件。例如,有一个 用户身份验证应始终在 .htaccess 文件,以及最近几年的另一个误解,即 mod_rewrite 指令必须放在 .htaccess 文件中。这根本不是 案子。您可以将用户身份验证配置放在主 服务器配置,事实上,这是首选的方式 事物。同样,mod_rewrite 指令在许多情况下工作得更好 方面,在主服务器配置中。

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

    来源:Apache documentation

    我之所以首先提到这一点是因为如果可以的话最好完全摆脱.htaccess,并在VirtualHost标签中使用Directory标签。话虽如此,其余部分将假设您出于任何原因坚持使用.htaccess 路线。

    为了分解这一点,可能会发生几件事:

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

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

      AllowOverride none
      

      AllowOverride all
      

      作为后续,Apache 文档还建议,出于安全考虑,如果您打算使用.htaccess 进行重写,则不要对每个文件夹都执行此操作。相反,对您需要添加.htaccess 的文件夹执行此操作。

    3. 您是否启用了mod_rewrite?这可能会导致问题。我注意到您在顶部有标签&lt;IfModule mod_rewrite.c&gt;。尝试注释掉这些标签并重新启动 Apache。如果您收到错误,则可能是因为您需要启用mod_rewriteHow to enable mod_rewrite for Apache 2.2

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

    【讨论】:

    • 对 apache2 配置设置很好,我每次都想念这个设置。
    【解决方案8】:

    还要确保在编辑 .htaccess 文件后打开 Rewrite Engline

    sudo a2enmod rewrite
    

    【讨论】:

    【解决方案9】:

    Laravel 已经附带了一个漂亮的 URL .htaccess...你应该很好地开箱即用... http://laravel.com/docs/installation#pretty-urls

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

    【讨论】:

    • 我激活了mod_rewrite,我复制了该页面上的代码,但仍然没有工作
    • 确保在 Apache 中您的路径设置为应用程序的公用文件夹。
    • ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
    • 启用 mod_rewrite 后是否重启了 apache?
    • 我有一个名为user 的文件夹是我保存照片的地方,我还有一个名为user 的刀片文件,当我在URL 中写入myproject.com/user 时会显示我的内容文件夹,图片
    【解决方案10】:

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

    • 将您的域映射到项目的公共文件夹(即 /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 的情况下直接访问任何路由,它会保护它。

    【讨论】:

      【解决方案11】:

      请注意

      使用 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 文件夹。

      就是这样

      【讨论】:

        【解决方案12】:
         RewriteEngine on
        
         RewriteCond %{REQUEST_FILENAME} !-f
         RewriteCond %{REQUEST_FILENAME} !-d
        
         RewriteRule ^(.*)$ index.php/$1 [L]
        

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

        【讨论】:

          【解决方案13】:

          希望这对我有所帮助。

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

          【讨论】:

            【解决方案14】:

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

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

            $cp server.php index.php
            

            【讨论】:

              【解决方案15】:

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

              【讨论】:

                【解决方案16】:

                如果您使用 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]
                

                【讨论】:

                  【解决方案17】:
                  <IfModule mod_rewrite.c>
                  RewriteEngine On
                  RewriteRule ^(.*)/(public)/(index.php)/$ $1/$4 [L]
                  </IfModule>
                  

                  【讨论】:

                  • 为您的解决方案提供更多解释
                  猜你喜欢
                  • 1970-01-01
                  • 2017-01-03
                  • 2017-09-28
                  • 2015-10-11
                  • 2019-12-27
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-06-30
                  • 2023-03-23
                  相关资源
                  最近更新 更多