当没有规则匹配时,mod_rewrite不会“通过”完整的URL:为什么?

时间:2014-01-09 20:34:38

标签: apache .htaccess mod-rewrite


以下问题是一个问题:我在CodeIgniter设置中将问题跟踪到自定义路由配置中的错误。该问题与mod_rewrite无关。请忽略。


以下是我的mod_rewrite规则的简化版本(在根.htaccess文件中):

RewriteCond %{REQUEST_URI} !^/codeigniter/index.php* [NC]
RewriteRule ^(.*)$ /index.php [QSA,NC,L,R]

当我传递以下网址时:

http://ssilogicserver.webhop.net/codeigniter/index.php/dashboard/index

...网址似乎路由到:

http://ssilogicserver.webhop.net/codeigniter/index.php

(请注意,最终的/dashboard/index似乎被剥离了。)

以下是mod_rewrite日志输出的片段:

[...] applying pattern '^(.*)$' to uri 'codeigniter/index.php/dashboard/index'
[...] RewriteCond: input='/codeigniter/index.php/dashboard/index' pattern='!^/codeigniter/index.php*' [NC] => not-matched
[...] pass through L:/daniel347x/__Dan_Root/ssilogicserver_web/ssilogicserver_web/codeigniter/index.php

请注意,即使规则不匹配,“通过”的网址也是TRUNCATED!

(另请注意,关于上面的第三行,文档根目录是L:/daniel347x/__Dan_Root/ssilogicserver_web/ssilogicserver_web/。另请注意,上面三行是连续出现的。)

我上面发布的.htaccess文件实际上只是真实内容的片段;同样,我提供的mod_rewrite日志的输出也是一个片段。在我的真实场景中,我实际上是首先在浏览器中传递http://ssilogicserver.webhop.net/codeigniter/index.php,这是第一次(我认为成功)通过http://ssilogicserver.webhop.net/codeigniter/index.php/dashboard/index规则重新路由到mod_rewrite以上列出的;后一个URL是有问题的URL。

我真正的问题是循环重定向。但是,我我已将问题与我上面粘贴的mod_rewrite日志文件中的行隔离开来。事实上,如果我没有在这个问题中提供足够的上下文 - 或者我是否必须创建一个小的,独立的,可重现的测试用例以及完整 .htaccess文件和< strong>完整 mod_rewrite日志文件 - 我会这样做(但这需要一段时间,所以我从这个问题开始)。

事实上,如果我已正确隔离相关详细信息,那么我的问题是:为什么mod_rewrite“通过”截断的网址,即使没有mod_rewrite规则似乎匹配

(注意: 文件位于codeigniter/index.php,所以也许这是相关的。)

1 个答案:

答案 0 :(得分:1)

这是你的规则:

RewriteCond %{REQUEST_URI} !^/codeigniter/index.php* [NC]
RewriteRule ^(.*)$ /index.php [QSA,NC,L,R]

实际上,如果仔细观察,规则就是按照它所做的去做。您的规则是,如果请求URI不是以/codeigniter/index.php开头,则会重定向到/index.php

由于此处有R标志,因此它正在对/index.php进行外部重定向,并在此过程中去除当前的REQUEST_URI ..

你可能意味着:

RewriteCond %{REQUEST_URI} !^/codeigniter/index\.php [NC]
RewriteRule ^(.*)$ index.php/$1 [L,R]