htaccess RewriteRule强制执行A​​pache 2.2的结束

嗨,我已经写了一些重写,但从我可以告诉从日志看来,规则继续执行,所以,虽然正确的结果是在执行中,但最终的重写是不正确的。

理想情况下,我需要使用[END]标志,但是我不能升级Apache 2.2的服务器软件,所以我将不得不解决这个问题。

我试图把“/ wedding?url = emily-and-john-2013”​​改写为“/ wedding / emily-and-john-2013”​​。

因为我使用CodeIgniter,我首先需要将“index.php / wedding / …”改写为“/ wedding / …”。

这是我迄今为止的规则。

 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / #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] #Sends requests for /wedding/{blahblahblah} to #/wedding?url={blahblahblah} RewriteRule ^index.php/wedding/([^_]*)$ index.php/wedding?url=$1 [L] </IfModule> 

这里是日志(稍微消毒,但你明白了):

  [*/sid#b8f1e8f0][rid#b93e1c68/initial] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/wedding -> SRV_PATH/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b93e1c68/initial] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/wedding/emily-and-john-2013 -> wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b93e1c68/initial] (3) [perdir SRV_PATH/] applying pattern '^(.*)$' to uri 'wedding/emily-and-john-2013' [*/sid#b8f1e8f0][rid#b93e1c68/initial] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/wedding' pattern='!-f' => matched [*/sid#b8f1e8f0][rid#b93e1c68/initial] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/wedding' pattern='!-d' => matched [*/sid#b8f1e8f0][rid#b93e1c68/initial] (2) [perdir SRV_PATH/] rewrite 'wedding/emily-and-john-2013' -> 'index.php/wedding/emily-and-john-2013' [*/sid#b8f1e8f0][rid#b93e1c68/initial] (3) [perdir SRV_PATH/] add per-dir prefix: index.php/wedding/emily-and-john-2013 -> SRV_PATH/index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b93e1c68/initial] (2) [perdir SRV_PATH/] trying to replace prefix SRV_PATH/ with / [*/sid#b8f1e8f0][rid#b93e1c68/initial] (5) strip matching prefix: SRV_PATH/index.php/wedding/emily-and-john-2013 -> index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b93e1c68/initial] (4) add subst prefix: index.php/wedding/emily-and-john-2013 -> /index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b93e1c68/initial] (1) [perdir SRV_PATH/] internal redirect with /index.php/wedding/emily-and-john-2013 [INTERNAL REDIRECT] [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/index.php -> SRV_PATH/index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/index.php/wedding/emily-and-john-2013 -> index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (3) [perdir SRV_PATH/] applying pattern '^(.*)$' to uri 'index.php/wedding/emily-and-john-2013' [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/index.php' pattern='!-f' => not-matched [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/index.php -> SRV_PATH/index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/index.php/wedding/emily-and-john-2013 -> index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (3) [perdir SRV_PATH/] applying pattern '^index.php/wedding/([^_]*)$' to uri 'index.php/wedding/emily-and-john-2013' [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (2) [perdir SRV_PATH/] rewrite 'index.php/wedding/emily-and-john-2013' -> 'index.php/wedding?url=emily-and-john-2013' [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (3) split uri=index.php/wedding?url=emily-and-john-2013 -> uri=index.php/wedding, args=url=emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (3) [perdir SRV_PATH/] add per-dir prefix: index.php/wedding -> SRV_PATH/index.php/wedding [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (2) [perdir SRV_PATH/] trying to replace prefix SRV_PATH/ with / [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (5) strip matching prefix: SRV_PATH/index.php/wedding -> index.php/wedding [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (4) add subst prefix: index.php/wedding -> /index.php/wedding [*/sid#b8f1e8f0][rid#b9174a78/initial/redir#1] (1) [perdir SRV_PATH/] internal redirect with /index.php/wedding [INTERNAL REDIRECT] [*/sid#b8f1e8f0][rid#b917e088/initial/redir#2] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/index.php -> SRV_PATH/index.php/wedding [*/sid#b8f1e8f0][rid#b917e088/initial/redir#2] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/index.php/wedding -> index.php/wedding [*/sid#b8f1e8f0][rid#b917e088/initial/redir#2] (3) [perdir SRV_PATH/] applying pattern '^(.*)$' to uri 'index.php/wedding' [*/sid#b8f1e8f0][rid#b917e088/initial/redir#2] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/index.php' pattern='!-f' => not-matched [*/sid#b8f1e8f0][rid#b917e088/initial/redir#2] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/index.php -> SRV_PATH/index.php/wedding [*/sid#b8f1e8f0][rid#b917e088/initial/redir#2] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/index.php/wedding -> index.php/wedding [*/sid#b8f1e8f0][rid#b917e088/initial/redir#2] (3) [perdir SRV_PATH/] applying pattern '^index.php/wedding/([^_]*)$' to uri 'index.php/wedding' [*/sid#b8f1e8f0][rid#b917e088/initial/redir#2] (1) [perdir SRV_PATH/] pass through SRV_PATH/index.php [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/wedding -> wedding [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (3) [perdir SRV_PATH/] applying pattern '^(.*)$' to uri 'wedding' [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/wedding' pattern='!-f' => matched [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/wedding' pattern='!-d' => matched [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (2) [perdir SRV_PATH/] rewrite 'wedding' -> 'index.php/wedding' [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (3) [perdir SRV_PATH/] add per-dir prefix: index.php/wedding -> SRV_PATH/index.php/wedding [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (2) [perdir SRV_PATH/] trying to replace prefix SRV_PATH/ with / [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (5) strip matching prefix: SRV_PATH/index.php/wedding -> index.php/wedding [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (4) add subst prefix: index.php/wedding -> /index.php/wedding [*/sid#b8f1e8f0][rid#b93a1c80/subreq] (1) [perdir SRV_PATH/] internal redirect with /index.php/wedding [INTERNAL REDIRECT] 

请注意,在第19行显示正确的URL! 不幸的是,它在那之后继续运行,一些最终的结果是不正确的。

任何想法如何改变规则达到预期的效果?

编辑

我刚刚注意到,如果我将[R]标志设置为redirect而不是重写,那么浏览器最终会指向正确的URL。 不知道什么是什么。

编辑2

随着[NS]标志添加到index.php规则,这里是日志:

  [*/sid#b8f1e8f0][rid#b9174dd0/initial] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/wedding -> SRV_PATH/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174dd0/initial] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/wedding/emily-and-john-2013 -> wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174dd0/initial] (3) [perdir SRV_PATH/] applying pattern '^(.*)$' to uri 'wedding/emily-and-john-2013' [*/sid#b8f1e8f0][rid#b9174dd0/initial] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/wedding' pattern='!-f' => matched [*/sid#b8f1e8f0][rid#b9174dd0/initial] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/wedding' pattern='!-d' => matched [*/sid#b8f1e8f0][rid#b9174dd0/initial] (2) [perdir SRV_PATH/] rewrite 'wedding/emily-and-john-2013' -> 'index.php/wedding/emily-and-john-2013' [*/sid#b8f1e8f0][rid#b9174dd0/initial] (3) [perdir SRV_PATH/] add per-dir prefix: index.php/wedding/emily-and-john-2013 -> SRV_PATH/index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174dd0/initial] (2) [perdir SRV_PATH/] trying to replace prefix SRV_PATH/ with / [*/sid#b8f1e8f0][rid#b9174dd0/initial] (5) strip matching prefix: SRV_PATH/index.php/wedding/emily-and-john-2013 -> index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174dd0/initial] (4) add subst prefix: index.php/wedding/emily-and-john-2013 -> /index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9174dd0/initial] (1) [perdir SRV_PATH/] internal redirect with /index.php/wedding/emily-and-john-2013 [INTERNAL REDIRECT] [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/index.php -> SRV_PATH/index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/index.php/wedding/emily-and-john-2013 -> index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (3) [perdir SRV_PATH/] applying pattern '^(.*)$' to uri 'index.php/wedding/emily-and-john-2013' [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/index.php' pattern='!-f' => not-matched [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/index.php -> SRV_PATH/index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/index.php/wedding/emily-and-john-2013 -> index.php/wedding/emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (3) [perdir SRV_PATH/] applying pattern '^index.php/wedding/([^_]*)$' to uri 'index.php/wedding/emily-and-john-2013' [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (2) [perdir SRV_PATH/] rewrite 'index.php/wedding/emily-and-john-2013' -> 'index.php/wedding?url=emily-and-john-2013' [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (3) split uri=index.php/wedding?url=emily-and-john-2013 -> uri=index.php/wedding, args=url=emily-and-john-2013 [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (3) [perdir SRV_PATH/] add per-dir prefix: index.php/wedding -> SRV_PATH/index.php/wedding [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (2) [perdir SRV_PATH/] trying to replace prefix SRV_PATH/ with / [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (5) strip matching prefix: SRV_PATH/index.php/wedding -> index.php/wedding [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (4) add subst prefix: index.php/wedding -> /index.php/wedding [*/sid#b8f1e8f0][rid#b9157758/initial/redir#1] (1) [perdir SRV_PATH/] internal redirect with /index.php/wedding [INTERNAL REDIRECT] [*/sid#b8f1e8f0][rid#b9173fe8/initial/redir#2] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/index.php -> SRV_PATH/index.php/wedding [*/sid#b8f1e8f0][rid#b9173fe8/initial/redir#2] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/index.php/wedding -> index.php/wedding [*/sid#b8f1e8f0][rid#b9173fe8/initial/redir#2] (3) [perdir SRV_PATH/] applying pattern '^(.*)$' to uri 'index.php/wedding' [*/sid#b8f1e8f0][rid#b9173fe8/initial/redir#2] (4) [perdir SRV_PATH/] RewriteCond: input='SRV_PATH/index.php' pattern='!-f' => not-matched [*/sid#b8f1e8f0][rid#b9173fe8/initial/redir#2] (3) [perdir SRV_PATH/] add path info postfix: SRV_PATH/index.php -> SRV_PATH/index.php/wedding [*/sid#b8f1e8f0][rid#b9173fe8/initial/redir#2] (3) [perdir SRV_PATH/] strip per-dir prefix: SRV_PATH/index.php/wedding -> index.php/wedding [*/sid#b8f1e8f0][rid#b9173fe8/initial/redir#2] (3) [perdir SRV_PATH/] applying pattern '^index.php/wedding/([^_]*)$' to uri 'index.php/wedding' [*/sid#b8f1e8f0][rid#b9173fe8/initial/redir#2] (1) [perdir SRV_PATH/] pass through SRV_PATH/index.php [*/sid#b8f1e8f0][rid#b912c738/subreq] (1) [perdir SRV_PATH/] pass through SRV_PATH/wedding 

您可以将这个规则移出<Directory>.htaccess上下文吗? 传递子请求似乎是问题。

如果没有,请尝试向index.php规则中添加一个[NS]标志,以防止它作用于该子请求?

 RewriteRule ^(.*)$ index.php/$1 [NS,L]