我有一个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不应该这样做吗?
...
答案 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
- 是否有人理解为什么这是必要的?
答案 1 :(得分:0)
RewriteRule
中的替换与DocumentRoot
相关。基于此,我建议你试试:
RewriteEngine On
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /communications/q/index.php/$1 [L]