我正在使用CodeIgniter运行LAMP环境。我希望能够使用其网址格式,例如http://localhost/controller/function/ID
,但默认情况下,它必须是http://localhost/index.php/controller/function/ID
。用户指南说我需要一个.htaccess文件来使前一种风格成为可能,并以此为例:
RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
但我不明白这是如何运作的。我应该把.htaccess放在哪里?是否必须在服务器根目录中?
如果我的服务器上运行了多个站点,该怎么办?我是否必须将其放入/var/www/
并根据加载的目录指定条件?或者我可以把它放在/var/www/site_using_codeigniter/
中吗?我不确定如何让它发挥作用。
如果请求的URL实际上不存在,我是否可以将其设置为仅映射到MVC URL?例如,http://localhost/articles/2009/some-article-name
不是服务器上的目录,因此它将映射到index.php
并提供给codeigniter,但http://localhost/forum
将存在于服务器,但不应由codeigniter处理。
我应该用.htaccess文件做任何其他事情吗?有什么好看的吗?
我改变了我的配置文件:
$config['index_page'] = ""; //used to be "index.php"
并将其添加到.htaccess
文件中:
RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
并将其保存在我的网站根目录(本例中为/var/www/cms/
)
我进入了/etc/apache2/conf.d/security(由/etc/apache2/apache2.conf包含)并执行了此操作:
<Directory />
AllowOverride All #was "none", but this was all commented out
Order Deny,Allow
Deny from all
</Directory>
然而,它仍然无法正常工作。如果我导航到http://localhost/cms/index.php/hello
,则会打印“Hello there”,但http://localhost/cms/hello
会出现404错误。
想法?
我不得不深入挖掘我的apache配置文件,最终找到所有目录的定义位置(我在此日期之前从未在服务器配置文件中搞砸过)并发现那令人讨厌的AllowOverride None
挫败了我的计划伟大。
现在它完美无缺。这里的所有答案都是切实可行的。
答案 0 :(得分:18)
在system/application/config/config.php
中,更改
$config['index_page'] = "index.php";
到
$config['index_page'] = "";
并在.htaccess
中添加以下内容:
RewriteEngine on
RewriteCond $1 !^(index\.php|images|stylesheets|scripts|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
将.htaccess文件添加到system
文件夹所在的同一目录中,因此在CodeIgniter根目录中,您应该
此外,由于您的服务器上运行了多个站点,因此您可能希望拥有VirtualHosts。将此内容添加到您拥有的每个网站的apache2.conf
的最后一部分:
Listen *:11000
<VirtualHost *:11000>
ServerAdmin you@somewhere.com
DocumentRoot "/var/www/cms"
ServerName you-dummy.com
<Directory "/var/www/cms">
AllowOverride All
Options +Indexes
DirectoryIndex index.php
Order allow,deny
Allow from all
</Directory>
ErrorLog logs/cms_log
CustomLog logs/cms_log common
</VirtualHost>
您现在可以从http://localhost:11000/
访问该网站,并使用http://localhost:11000/hello
访问该控制器。
答案 1 :(得分:16)
在这里尝试了答案,但这对我不起作用。所以我尝试了以下内容,它确实......
在根目录中创建.htaccess,其中index.php和license.txt可用。在文件中输入以下代码并存储它:
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]
完成!尝试它,它肯定会工作。 希望它有所帮助
答案 2 :(得分:5)
在找到更改“AllowOverRide All”的位置时遇到了一些问题。
从this guide我找到了(默认)文件。
在Ubuntu上删除Index.php CodeIgniter URL
初步说明。 我正在使用root权限运行本教程中的所有步骤,因此请确保以root身份登录:
sudo su
在apache上启用mod_rewrite模块。 首先按如下方式启用模块:
a2enmod rewrite
将所有出现的“AllowOverRide None”更改为“AllowOverRide All”。基本上所有“无”到“全部”在以下文件中:
gedit **/etc/apache2/sites-available/default**
重启Apache:
/etc/init.d/apache2 restart
在CodeIgniter(application \ config)上打开文件config.php。
删除$config['index_page'] = "index.php";
$config['index_page'] = "";
在CodeIgniter根目录下创建文件.htaccess。 使用以下代码填充文件:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
现在,CodeIgniter URL上的Index.php消失了
答案 3 :(得分:2)
这个特殊的.htaccess文件看起来需要进入你网站的根目录(即当前正在执行的网站。)
查看documentation for RewriteCond
以了解您可以指定的其他类型的条件。基本上只有在RewriteRule
的所有前一个RewriteCond
匹配时才会应用RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
。如果请求的URL不存在,您可以尝试将这些规则添加到仅重定向:
{{1}}
mod_rewrite非常强大,但如果它没有按照你的想法做到,那将是一个真正的痛苦。我也不知道有什么方法可以调试它的指令。
至于你可以用.htaccess文件做什么,Apache docs for htaccess files总是一个好的起点。最常见的用途是针对每个目录的身份验证。 .htaccess文件支持大多数服务器配置指令(假设服务器的AllowOverride这样说),但有些指令具有不同的语法。
答案 4 :(得分:1)
将它放在网站的文档根目录中。
如果您有多个网站,请将其放在每个此类网站的顶部。
如果您有多个站点在同一目录中运行,则可以使用RewriteCond将特定站点排除或包含在重写规则中。
您可以用同样的方式排除某些目录(例如/文章)。
答案 5 :(得分:1)
我在CodeIgnitor链接图像,js,css时遇到了同样的问题。 现在一切正常谢谢你们!我按照以下步骤操作。将所有其他注释合并到我的场景中。希望这有助于某人。
更改了httpd.conf
<Directory --your root dir-- />
AllowOverride All #was "none", but this was all commented out
Order Deny,Allow
Deny from all
</Directory>
在htdocs \ yoursite(站点根目录)目录中创建了一个空的.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]
答案 6 :(得分:1)
尝试这个,它可以实现穿孔
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]
答案 7 :(得分:0)
<IfModule rewrite_module>
RewriteEngine on
RewriteBase /
# Removes the "/" at the end
RewriteRule (.+)/$ /$1 [L,R]
RewriteCond $1 !^(index\.php|dhtml|img|css|js|favicon\.ico|robots\.txt)
RewriteRule ^([^?&]+) /index.php/$1 [L]
</IfModule>
答案 8 :(得分:0)
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
根文件夹中.htaccess中的简单文件!适合我。