如何在Codeigniter 4中从网址中移除public/index.php/

18
16个回答

23

只需做以下步骤:

第一步:在 public/ 目录下,将 index.php 和 .htaccess 复制到您的项目根目录。

第二步:在项目根目录中,打开 index.php 并编辑以下行:

index.php -> $pathsPath = FCPATH . '../app/Config/Paths.php';

改为

index.php => $pathsPath = FCPATH . 'app/Config/Paths.php';


谢谢,这就是解决方案。 - Riyad Khalifeh
1
这真的安全吗? - Saud Khan
4
不建议这样做。您可以将public重命名为public_html。public文件夹中的文件是“公共”文件,其余文件则不是。 - TimBrownlaw
6
据我的理解,这与一开始设立“public”目录的整个理念相违背。将index.php文件放置在那里是出于安全原因。Nassim提供的解决方案对我有效。 - Raymond
这个答案不安全,你可以看到你的.env文件很容易被http://yourdomain.tdl/访问。最好的方法是在.htaccess文件中使用<Files>标签来保护.env文件。 - swapnil akolkar

17
好的,这是我解决这个问题的方法: 你需要两个 .htaccess 文件。 第一个位于项目的根目录下 "/.htaccess", 第二个位于 "public/.htaccess" 文件夹中。
这里是第一个 ".htaccess" 文件: "/.htaccess"。
# this is my version (Nassim) of the htaccess file , I use this one in the root directory "/"
# of the project and a second .htaccess in the public directory

DirectoryIndex /public/index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|assets|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./public/index.php/$1 [L,QSA]

第二个文件(CI安装时自带)为"public/.htaccess"。

# I recommend you remove `IfModule`. Because if you need mod_rewrite,
# you don't need `IfModule`. If you don't need it, you don't need this file
# at all.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond $1 !^(index\.php|images|assets|doc|data|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

除了 .htaccess 文件,你还需要在根目录中放置什么? - arun kumar
抱歉@arunkumar,太忙了没回复,就这样,没有别的。 - Nassim
@HeribertoJuárez 很棒! - Nassim
1
第一个 .htaccess 文件(在根目录中的那个)对我不起作用,因此我使用了来自另一个答案的这个文件:https://dev59.com/6b_qa4cB1Zd3GeqPQtgm。我使用了你建议的第二个文件,现在一切都正常了 :) - Diego Stéfano

13

前往 app/Config/App.php 文件,然后找到 public $indexPage = 'index.php';,将其修改为 public $indexPage = '';

操作成功


实际上它确实做到了!谢谢 - PJunior
推荐的方式 - Usira

4
在公共目录之外创建一个名为 index.php 的文件,并编写以下命令。
require_once './public/index.php';

好的。


当使用多个控制器时,不起作用。 pages 将位于 public/pages。https://codeigniter.com/user_guide/tutorial/static_pages.html - Aldo

2
  1. 如果您还没有设置虚拟主机,请先进行设置,但是请确保将其指向 /public 目录(以xampp为例):

ServerAdmin webmaster@example.com
ServerName example.com
DocumentRoot "path-to-project/public"
<Directory "path-to-project/public">
    Order allow,deny
    Allow from all
    AllowOverride All
    Require all granted
</Directory>

  1. 不要触碰默认CI4发行版中的任何.htaccess文件
  2. 编辑app/Config/App.php - $baseURL = 'http://www.example.com/'; $indexPage = '';

1
我不知道您是如何获得这个 .htaccess 文件的。如果您从这里下载 CodeIgniter 4,您会发现 Htaccess 文件与您添加的文件不同。
由于 CodeIgniter(1、2、3)到 Codeigniter 4 发生了许多变化,htaccess 已经移动到 public/ 文件夹中,它将设置为文档根目录,而在 CI 4 中放在外部的 .htaccess 文件将不再有效
正确的路径到 .htaccess
public/.htaccess

注意:我刚刚测试了index.php的URL问题,没有出现任何问题。没有index.php也能正常工作/加载。

1
项目结构codeigniter4

Project Structure codeigniter4

如果在Xamp中运行项目,会显示如下内容:

enter image description here


将public文件夹中的index.php复制到根目录下的index.php。 在此输入图片描述
在Web浏览器中运行时,显示以下错误以解决此问题: {{link1:输入图像描述}}
解决方案 在此输入图像描述
    $pathsConfig = FCPATH . '../app/Config/Paths.php';
    to
   $pathsConfig = FCPATH . 'app/Config/Paths.php';

现在运行。

enter image description here


在根目录中创建 .htaccess 文件。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

enter image description here


现在您可以在没有.htaccess文件的情况下切换您的控制器名称,您的URL必须像这样:http://localhost:8080/payinlinks/index.php/login,否则http://localhost:8080/payinlinks/login
enter image description here

1

步骤1:

  • 打开Your_Project_Folder/app/Config/App.php文件
  • $baseURL = 'http://localhost/';[或者如果是:$baseURL = 'http://localhost:8080/';]改为$baseURL='http://localhost/Your_Project_Name';
  • 同时将$indexPage = 'index.php';改为$indexPage = '';

enter image description here

步骤2:

  • 进入Your_Project_Folder/public文件夹

  • 将此文件夹中的.htaccessindex.php文件复制并粘贴到您的文件夹的根目录Your_Project_Folder下(其中存在sparkenv文件)。

enter image description here

步骤三:

  • 打开Your_Project_Folder/index.php文件(我们刚刚将其粘贴到项目根目录中)

  • 更改FCPATH . '../app/Config/Paths.php';FCPATH . 'app/Config/Paths.php';

enter image description here

全部完成!!!


0
/public 目录下创建一个 .htaccess 文件,文件内容为:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

0
在 CodeIgniter 4.2 或以上版本中,您必须遵循 3 个步骤第一步: 前往此文件夹

App -> config -> app.php

使用您的项目文件夹名称更新 base_url,就像我们在 Codeigniter 3 中所做的那样。 像这样:
public $baseURL = 'http://localhost/your_project_name/';

如果使用composer安装ci 4,则会有这种类型的base_url,您需要将其更改为上面定义的base_url
public $baseURL = 'http://localhost:8080';

第二步: 前往public文件夹,复制 index.php.htaccess (记得复制而不是剪切) 然后将它们粘贴根目录

注意:与我们在Codeigniter 3中通过在根文件夹上创建.htaccess文件并粘贴相关代码来删除index.php相同。

第三步: 用此代码替换根目录文件夹中的.htaccess文件代码:

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

然后打开root文件夹下的index.php文件,检查第20行或者这一行:

require FCPATH . '../app/Config/Paths.php';

然后将其中的../移除,变成如下形式:

require FCPATH . 'app/Config/Paths.php';

如果您在public文件夹中创建了cssjs文件夹,并使用views/header.phpviews/footer.phpviews/index.php上的base_url将它们连接起来,那么可能会出现相关问题,无法获取这些文件:

当我们使用bootstrapcdn时,它会给出这个syntax,我们可以像这样本地化,但由于id="bootstrap-style",所以会出现问题,请从此行中删除它:

<link href="<?php echo base_url();?>/public/assets/css/bootstrap.min.css" id="bootstrap-style" />

另外,从其他CSS链接文件中删除这个type="text/css"或任何id=""出现问题。
正确的添加CSS链接方式是在链接上定义rel="stylesheet",如下所示:
<link rel="stylesheet" href="<?php echo base_url();?>/public/assets/css/bootstrap.min.css" />

在我的情况下,我遇到了与bootstrapcss相关的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接