如何从 Codeigniter 4 中的 url 中删除 public/index.php/

Posted

技术标签:

【中文标题】如何从 Codeigniter 4 中的 url 中删除 public/index.php/【英文标题】:How to remove public/index.php/ from url in Codeigniter 4 【发布时间】:2018-06-30 18:14:27 【问题描述】:

我想要像 www.sample.com/controller 这样的普通 URL,而不是 www.sample.com/public/index.php/controller。

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

我的 .htaccess 文件

【问题讨论】:

谷歌.htaccess 感谢您回复刚刚编辑的问题 【参考方案1】:

我不知道你是怎么得到这个.htaccess的。如果您 download CodeIgniter 4 from here 并且您可以看到 Htaccess 文件与您添加的文件不同。

由于 CodeIgniter (1,2,3) 对 Codeigniter 4 有很多更改,htaccess 移至 public/ 文件夹,这将 设置为文档根目录.htaccess在 CI 4 中将无效


.htaccess的正确路径

public/.htaccess

注意:我刚刚测试了index.php URL 问题,并没有这样的问题。没有index.php,工作/加载很好

【讨论】:

【参考方案2】:

/public 中创建一个 .htaccess 文件:

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

【讨论】:

【参考方案3】:

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

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

改变:

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

改为

($pathsPath = FCPATH .'app/Config/Paths.php';)

enter image description here

【讨论】:

【参考方案4】:

你试过这个吗:

    RewriteEngine On
    RewriteBase /yoursite.com/
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ public/index.php/$1 [L]

【讨论】:

【参考方案5】:

好的,这就是我解决这个问题的方法: 您需要 2 个 .htaccess 文件 项目根路径“/.htaccess”中的第一个 公共文件夹“public/.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文件还需要什么? 抱歉 @arunkumar ,忙着回复,仅此而已 @HeribertoJuárez 太棒了!【参考方案6】:

做吧

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

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

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

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

【讨论】:

谢谢,这就是解决方案。 这真的安全吗? 不推荐。您可以将 public 重命名为 public_html。公共文件是“公共”文件,其余的不是。 据我了解,这违背了首先拥有 /public 目录的整个想法。出于安全原因,index.php 文件位于此处。 Nassim 提供的解决方案对我有用。【参考方案7】:
    设置虚拟主机(如果您尚未设置),但确保指向 /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>

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

【讨论】:

【参考方案8】:

我能够在一个项目中“解决”托管服务器中的问题。在我使用更新版本的 codeigniter 4 创建了一个新项目后,我意识到我不能再使用相同的解决方案,经过数小时的研究,我找到了一个非常简单的解决方案。

我所做的是使用位于项目根文件夹中的 .htaccess 将根目录更改为公用文件夹。

#RewriteEngine on
#RewriteCond %HTTP_HOST ^mydomain.com$ [NC,OR]
#RewriteCond %HTTP_HOST ^mydomain.com$
#RewriteCond %REQUEST_URI !public/
#RewriteRule (.*) /public/$1 [L]

使用这个技巧,我可以毫无问题地将我的 codeigniter 4 加载到实时服务器中。 实际上,我用它在子域中配置了一个 codeigniter 4 项目。

【讨论】:

【参考方案9】:

在公共目录之外创建一个名为 index.php 的文件并编写命令

require_once './public/index.php';

就是这样。

【讨论】:

在使用多个控制器时不起作用。 pages 将位于 public/pages codeigniter.com/user_guide/tutorial/static_pages.html【参考方案10】:

转到 app/Config/App.php 然后 public $indexPage = 'index.php'; 更改为 public $indexPage = '';

像魅力一样工作

【讨论】:

事实上确实如此!坦克【参考方案11】:

更改 index.php =>

require realpath(FCPATH . 'app/Config/Paths.php') ?: FCPATH . '../app/Config/Paths.php';

require realpath(FCPATH . 'app/Config/Paths.php') ?: FCPATH . 'app/Config/Paths.php';

【讨论】:

【参考方案12】:

转到 app/Config/App.php 并找到 public $indexPage = 'index.php';。 从此公共变量中删除 index.php 即可。

【讨论】:

这个解决方案has already been proposed before。在发布旧问题的答案时保持警惕...【参考方案13】:

要解决上述从 url 中删除 public/index.php 的问题,您应该按照以下步骤操作:

    public/ 目录复制index.php.htaccess 文件。

    将文件添加到项目根目录。

    将您的根项目目录 index.php 文件 $pathsPath = realpath(FCPATH . '../app/Config/Paths.php'); 更改为 $pathsPath = realpath(FCPATH . 'app/Config/Paths.php');

这里是 index.php 文件的完整代码:

// Valid PHP Version?
$minPHPVersion = '7.2';
if (phpversion() < $minPHPVersion)

    die("Your PHP version must be $minPHPVersion or higher to run CodeIgniter. Current version: " . phpversion());

unset($minPHPVersion);

// Path to the front controller (this file)
define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR);

// Location of the Paths config file.
// This is the line that might need to be changed, depending on your folder structure.
$pathsPath = realpath(FCPATH . 'app/Config/Paths.php');
// ^^^ Change this if you move your application folder

/*
 *---------------------------------------------------------------
 * BOOTSTRAP THE APPLICATION
 *---------------------------------------------------------------
 * This process sets up the path constants, loads and registers
 * our autoloader, along with Composer's, loads our constants
 * and fires up an environment-specific bootstrapping.
 */

// Ensure the current directory is pointing to the front controller's directory
chdir(__DIR__);

// Load our paths config file
require $pathsPath;
$paths = new Config\Paths();

// Location of the framework bootstrap file.
$app = require rtrim($paths->systemDirectory, '/ ') . '/bootstrap.php';

/*
 *---------------------------------------------------------------
 * LAUNCH THE APPLICATION
 *---------------------------------------------------------------
 * Now that everything is setup, it's time to actually fire
 * up the engines and make this app do its thang.
 */
$app->run();

【讨论】:

【参考方案14】:

项目结构 codeigniter4


If Run project in Xamp show Like this



将 public-->index.php 复制到根文件夹-->index.php


现在在 webbrowser 中运行 Like this 显示 this like 错误来解决这个问题


解决方案

    $pathsConfig = FCPATH . '../app/Config/Paths.php';
    to
   $pathsConfig = FCPATH . 'app/Config/Paths.php';

现在运行


在根文件夹中创建 .htaccess

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


现在您可以在不使用 .htaccess 的情况下切换控制器名称,您的 url 必须像这样 http://localhost:8080/payinlinks/index.php/login 否则 http://localhost:8080/payinlinks/login

【讨论】:

以上是关于如何从 Codeigniter 4 中的 url 中删除 public/index.php/的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Codeigniter 中的视图获取控制器的 URL?

如何从 CodeIgniter 中的 URL 中删除控制器和函数名称

如何从 Codeigniter 中的 URL 中删除“&per_page=”

codeigniter 从 url 获取值

如何从Codeigniter中的URL中删除“&per_page =”

我该如何解决这个“找不到对象!” CodeIgniter-4 中的错误?