CodeIgniter htaccess 和 URL 重写问题

Posted

技术标签:

【中文标题】CodeIgniter htaccess 和 URL 重写问题【英文标题】:CodeIgniter htaccess and URL rewrite issues 【发布时间】:2013-01-24 20:58:24 【问题描述】:

我以前从未使用过 CodeIgniter,更不用说任何 php 框架了,我想我会尝试一下。一切都很好,除了我似乎无法从 URL 中删除 index.php 并仍然访问我的页面。

我从来没有使用过 MVC 结构,所以我边走边学,如果我做错了,请原谅我。

我试图通过简单地输入 localhost/ci/about 来访问我创建的名为“about_page.php”的视图,但目前我只能使用 localhost/ci/ 来访问它index.php/about

页面的控制器是:/application/controllers/about.php 该页面的模型是:/application/models/about_model.php 该页面的视图是:/application/views/about_page.php

我已经搜索过此问题的解决方案,但一直没有找到。这是我已经搜索过的地方:

CodeIgniter - removing index.phpCodeigniter - how to remove the index.php from url?http://www.farinspace.com/codeigniter-htaccess-file/

CodeIgniter 在“应用程序”文件夹中附带一个 .htaccess 文件,其中仅包含 Allow Deny From All。所以我在根目录下创建了一个新的 .htaccess 文件,http://localhost/ci/.htaccess 并将这段代码添加到其中:

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

当 .htaccess 文件位于根目录中时,我会收到 500 内部服务器错误。当我将完全相同的文件复制到应用程序文件夹中时,500 错误消失了,但我仍然无法使用 localhost/ci/about

访问关于页面

我已经将$config['index_page'] = 'index.php'; 更改为$config['index_page'] = ''; 并且我尝试将$config['uri_protocol'] = 'AUTO'; 更改为$config['uri_protocol'] = 'REQUEST_URI';,但我仍然收到内部服务器错误。

我进入了 httpd.conf 文件并取消了 mod_rewrite.so 模块的注释,所以我知道 mod_rewrite 处于活动状态。

有没有人知道为什么这不起作用或我如何才能完成这项工作?我知道 *** 上有很多关于这个主题的问题,但我找不到能回答我问题的问题。

我这样做对吗?我是否应该能够通过访问 localhost/ci/about 来访问 about 页面,还是必须在 'application' 目录中创建一个 'about' 目录?

【问题讨论】:

移除“RewriteBase” 刚刚尝试过...仍然出现内部服务器错误 取消注释重写模块后是否重新启动了网络服务器? htaccess更改后不需要重启... 模块激活后必须重启。 【参考方案1】:

删除index.php有3个步骤。

    application/config.php 文件中进行以下更改

    $config['base_url'] = 'http://'.$_SERVER['SERVER_NAME'].'/Your Ci folder_name';
    $config['index_page'] = '';
    $config['uri_protocol'] = 'AUTO';
    

    使用以下代码在您的根目录中创建.htaccess 文件

    RewriteEngine on
    RewriteCond $1 !^(index\.php|resources|robots\.txt)
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ index.php/$1 [L,QSA]
    

    启用重写引擎(如果尚未启用)

    i. 首先,使用以下命令启动它:

    a2enmod rewrite
    

    ii.编辑文件/etc/apache2/sites-enabled/000-default

    将所有AllowOverride None 更改为AllowOverride All

    注意:在最新版本中您需要更改/etc/apache2/apache2.conf 文件

    iii. 使用以下命令重新启动服务器:

    sudo /etc/init.d/apache2 restart
    

【讨论】:

change the AllowOverride None to AllowOverride All 这很重要,但很少被提及。在更改之前,您的 .htaccess 并不重要。 在 Mac OS X 上,我在 /etc/apache2/users/username.conf 中进行了更改,除了使用 ellislab.com/codeigniter/user-guide/general/urls.html 提供的 .htaccess 之外什么也没做【参考方案2】:

你的.htaccess 有点不对劲。看看我的:

 RewriteEngine On
 RewriteBase /codeigniter  

  RewriteCond %REQUEST_FILENAME !-f
  RewriteCond %REQUEST_FILENAME !-d
  RewriteCond $1 !^(index\.php|images|robots\.txt|css|docs|js|system)
  RewriteRule ^(.*)$ /codeigniter/index.php?/$1 [L]

注意两个地方的“codeigniter”。

之后,在您的配置中:

base_url = "http://localhost/codeigniter"
index = ""

在适当的地方将 codeigniter 更改为“ci”

【讨论】:

@Rahul 解决方案应该是完美的解决方案,但没有以某种方式工作,您的解决方案有所帮助,在 index.php 之后的 rewriterule 中使用问号 Notice "codeigniter" in two places. - 在发布的示例中,您不需要在两个地方需要“codeigniter”。在上面的示例中,RewriteBase 指令是多余的。尽管最好从RewriteRule 替换 中删除路径并保留RewriteBase。 IE。 index.php?/$1 [L] 谢谢。我已经尝试了很多 htaccess 代码。这对我来说很好用【参考方案3】:
<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteBase /dmizone_bkp
   RewriteCond %REQUEST_FILENAME !-f
   RewriteCond %REQUEST_FILENAME !-d
   RewriteCond $1 !^(index\.php|images|robots\.txt|css|docs|js|system)
   RewriteRule ^(.*)$ /dmizone_bkp/index.php?/$1 [L]
</IfModule> 

【讨论】:

如果您使用的是RewriteBase 指令,那么您也不需要在RewriteRule substitution 中包含路径。 IE。 index.php?/$1 [L] 就足够了(而且更可取)。 最后一个RewriteCond 是什么意思? RewriteCond %REQUEST_FILENAME !-f 还不够吗?【参考方案4】:

这对我有用

将您的 .htaccess 文件移动到根文件夹(在我的情况下位于应用程序文件夹之前)

RewriteEngine on
RewriteBase /yourProjectFolder
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule .* index.php/$0 [PT,L]

我的 config.php 看起来像这样 (application/config/config.php)

$config['base_url'] = "";
$config['index_page'] = "index.php";
$config['uri_protocol'] = "AUTO";

让我知道它是否也适合你们!干杯!

【讨论】:

或者,将 .htaccess 移动到 /yourProjectFolder (我认为在 OP 的情况下为 /ci)并完全删除 RewriteBase 指令。 (顺便说一句,您不需要每个目录 .htaccess 文件中的 PT 标志 - 这是隐含的。)【参考方案5】:

我正在使用这样的东西 - codeigniter-htaccess-file,这是一篇很好的文章。

将 .htaccess 文件保留在 CI 根目录中 确保 mod_rewrite 已打开 检查拼写错误(即控制器文件/类名) 在/application/config/config.php中设置$config['index_page'] = ""; 在/application/config/routes.php中设置你的默认控制器$route['default_controller']="home";

如果您正在运行 CI (2.1.3) 的全新安装,则不会有太多问题。

2个配置文件 控制器 .htaccess mod_rewrite

阅读

Codeigniter .htaccess redirect-index-php-in-codeigniter

【讨论】:

声称不会出错的事情在 Windows 上通常是正确的。在 Linux 上,由于其他原因可能会出错(同样可能适用于某些版本的 Windows 服务器)。本质上,恕我直言,这可能是关于在 CodeIgniter 中寻找问题的最完整答案。 (完整性的唯一例外是 PHP 可能在其他环境中运行 - 其他 Web 服务器,但从问题看起来 Apache 是环境)【参考方案6】:

对于那些使用 wamp 服务器的用户,请按照@Raul Chipad 解决方案的前 2 步操作:

    单击 wamp 图标(通常为绿色),转到“Apache”>“Apache 模块”>“rewrite_module”。应该勾选“rewrite_module”!然后就是要走的路!

【讨论】:

这行得通。我的所有配置都是正确的,但在我这样做之前,没有任何效果。谢谢。【参考方案7】:

如果不工作

$config['uri_protocol'] = 'AUTO';

改成

$config['uri_protocol'] = 'PATH_INFO';

如果不起作用,请将其更改为

$config['uri_protocol'] = 'QUERY_STRING';

如果使用这个

$config['uri_protocol'] = 'ORIG_PATH_INFO';

重定向或标头位置到不在 htaccess 中的 url 将不起作用,您必须在 htaccess 中添加 url 才能工作

【讨论】:

【参考方案8】:

我在 Linux Ubuntu 14 上遇到过类似问题。

在浏览器中不断出现 403 错误消息并在此处阅读所有答案后,我无法弄清楚出了什么问题。

然后我伸手去查看apache的错误日志,终于得到了一个有点出乎意料但完全合乎逻辑的提示。

codeIgniter 主文件夹对文件夹没有 X 权限,从而使 Web 服务器无法读取其他所有内容。

chmod ugo+x yourCodeIgniterFolder

修复了第一个问题。杀死 403 错误。

但后来我开始收到错误 500。

罪魁祸首是 .htaccess 中的错误设置行

然后我开始收到 php 错误。

罪魁祸首是与主文件夹相同的问题,在应用程序和系统文件夹中的内部文件夹没有“其他”权限的 X 标志。

我对这个问题的两分钱:阅读 Apache Error.log。

但是,也要注意安全问题。 CodeIgniter 建议将应用程序和系统文件夹移出 Web 空间,因此如果这些文件夹保留在 Web 空间中,则应非常小心地更改权限。

这里值得一提的另一件事是,我已将下载的 CodeIgniter 存档直接解压缩到网络空间。文件夹权限可能是直接从存档中创建的。鉴于它们是安全的,但 CodeIgniter 手册 https://codeigniter.com/user_guide/installation/index.html 中没有提到文件夹访问问题(在类似 unix 的系统上),也许应该在其中提到如何放宽 CodeIgniter 工作的安全性同时保持生产安全性的指南系统(如前所述,手册中已经有一些安全提示)。

【讨论】:

【参考方案9】:

只需将其添加到 .htaccess 文件中即可:

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

【讨论】:

【参考方案10】:

默认情况下,以下内容位于application 文件夹中,按照建议将其移动到根目录中。

leave the .htaccess file in CI root dir

【讨论】:

【参考方案11】:

打开 application/config/config.php 文件并进行如下更改,

    通过替换$config['base_url'] 的值来设置您的基本网址,如 $config['base_url'] = 'http://localhost/YOUR_PROJECT_DIR_NAME';

    $config['index_page']配置清空为$config['index_page'] = '';

在项目根文件夹中创建新的 .htaccess 文件并使用给定的设置, RewriteEngine on RewriteCond $1 !^(index\.php|resources|assets|images|js|css|uploads|favicon.png|favicon.ico|robots\.txt) RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d RewriteRule ^(.*)$ index.php/$1 [L,QSA]

重启服务器,打开项目,一切顺利。

【讨论】:

以上是关于CodeIgniter htaccess 和 URL 重写问题的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 问题、虚拟子域和 Codeigniter

htaccess 帮助共存的 Codeigniter 和 Wordpress 安装

Codeigniter Htaccess 和 URL 重定向问题

Codeigniter - XAMP - htaccess 问题

使用 .htaccess 文件删除 CodeIgniter 中的 index.php

CodeIgniter后端前端.htaccess路由器