使用自定义htaccess mod重写

时间:2015-08-11 04:12:42

标签: php .htaccess codeigniter mod-rewrite

在使用自定义(有点奇怪)的htaccess文件夹映射时,我遇到了codeignighter的问题。但是,它应该在技术上有效,但事实并非如此。有人能帮助我吗?

场景1(正常工作):

文件夹结构和密钥文件

/ is the website root
/.htaccess
/api/ <this is the CodeIgniter Root, with index.php and default CI .htaccess>

/ htaccess的:

RewriteEngine On
RewriteRule ^api/(.*)$ /api/$1 [L]

访问mydomain.com/api/admin/例如让我进入我的admin-controller / index操作并加载视图。

对于$ _REQUEST,index.php上的

var_dump显示

array (size=1)
'admin/' => string '' (length=0)

场景2(不起作用):

文件夹结构和密钥文件

/.htaccess
/current/.htaccess
/current/api/ <this is the CodeIgniter Root, with index.php and default CI .htaccess, this is the same folder/files/htaccess as above scenario>

/ htaccess的:

RewriteEngine On
RewriteRule ^(.*)$ /current/$1 [L]

/current/.htaccess:

RewriteEngine On
RewriteRule ^api/(.*)$ /api/$1 [L]

访问mydomain.com/api/admin/例如,让我进入Codeigniter 404页面/视图。

对于$ _REQUEST,index.php上的

var_dump显示(与场景1相同)

array (size=1)
'admin/' => string '' (length=0)

这里发生了什么?我知道htaccess重写很奇怪,但就Codeigniter所见,路由是相同的(admin /)。但他们的行为都不同。为什么?我尝试了所有我能想到的,就我所知,codeigniter看到了正确的路径,就像请求对象一样,但CI路由器不知何故没有正确使用它。

任何帮助表示感谢,如果您能想到任何我可以尝试帮助进一步调试的信息,请告诉我。

注意:我使用双htaccess的原因是我可以根据时间/场景安排不同的CI实例(您可以使用重写条件来提供不同的文件夹而不是“当前”文件夹)。我目前没有使用它,因此在方案2中,根只有一个“当前”文件夹。

2 个答案:

答案 0 :(得分:2)

从CodeIgniter的URI中删除index.php可能会很痛苦。上周我遇到了类似的情况:我在/var/www/html/ci我的项目中有我的根目录...所以在/ci内我有以下内容.htaccess:

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

并在apache2配置文件中添加了以下内容:

<Directory /var/www/html/ci/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

同时检查application/config/config.php中是否有:

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

希望有帮助...

答案 1 :(得分:0)

您正在将请求重定向到文件夹,而实际上您应该将这些请求重定向到CodeIgniter的index.php文件。

e.g:

RewriteRule ^api/(.*)$ /api/index.php?/$1 [L]

假设您在配置文件中将'index_page'设置为空字符串,如果它设置为index.php,那么在请求某些内容时,您应该在url中包含index.php。