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 问题