Apache mod_rewrite通常可以工作,但不能在这个文件夹中工作 - 出了什么问题?

时间:2010-10-13 12:23:26

标签: apache .htaccess mod-rewrite codeigniter

我有一个Apache Web服务器,通常可以很好地处理mod_rewrite。我有一个名为/communications/q/的目录,我想在输入的其余URI之前重写任何URI以插入“index.php”

例如,/communications/q/something/else实际上应该提供communications/q/index.php/something/else。这是标准的PHP CodeIgniter设置。

我在/ q /目录中放置了一个.htaccess文件并将其中包含在其中:

RewriteEngine On
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

当我甚至尝试转到/ communications / q /时,我收到404 Not Found错误。这根本没有意义,因为如果我评论.htaccess的东西,我得到index.php页面,如果我去/ communications / q /,但是使用代码,我得到404 Not Found。

有人发现我做错了吗?

仅供参考我有一个名为hello的控制器,所以技术/通信/ q / hello应该可以工作,但它也是404。但是.htaccess注释掉了,/communications / q / index.php / hello工作正常。

...

====添加说明#1 ====

使用CodeIgniter,我应该能够使用URI结构调用控制器和函数。所以我实际上有一个名为welcome的控制器,然后是一个名为index()的函数,它是默认函数,还有一个名为hello()的函数。

CI的工作方式,我会写/communications/q/index.php/welcome,我会从index()控制器获得welcome函数的输出。事实上,现在可以很好地运作

不幸的是,在URI中使用那些奇怪的index.php是不实用且不必要的,因此CI建议使用.htaccess来允许URI省略URI的该部分并使用mod_rewrite在后台静默重新输入它。 / p>

但是,当我添加上面的RewriteRule时,它不起作用。所以:

/controller/q/welcome在返回与/controller/q/index.php/welcome完全相同的内容时会返回404错误。那就是问题所在。上面的RewriteRule不应该这样做吗?

...

2 个答案:

答案 0 :(得分:0)

答案最终在CodeIgniter维基中。我用以下内容替换了我的.htaccess代码:

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /communications/q/

# Removes access to the system folder by users.
# Additionally this will allow you to create a System.php controller,
# previously this would not have been possible.
# 'system' can be replaced if you have renamed your system folder.

RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

# When your application folder isn't in the system folder
# This snippet prevents user access to the application folder
# Submitted by: Fabdrol
# Rename 'application' to your applications folder name.

RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

# Checks to see if the user is attempting to access a valid file,
# such as an image or css document, if this isn't true it sends the
# request to index.php

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

</IfModule>

<IfModule !mod_rewrite.c>

# If we don't have mod_rewrite installed, all 404's
# can be sent to index.php, and everything works as normal.
# Submitted by: ElliotHaughin

ErrorDocument 404 /index.php

</IfModule>

一切都很完美。我认为,主要的相关变化是在?之后向RewriteRule添加index.php - 是否有人理解为什么这是必要的?

来源:http://codeigniter.com/wiki/mod_rewrite/

答案 1 :(得分:0)

RewriteRule中的替换与DocumentRoot相关。基于此,我建议你试试:

RewriteEngine On
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /communications/q/index.php/$1 [L]