为什么Apache的mod_rewrite重写我的两次网址是什么? [英] Why Apache mod_rewrite rewrites twice my URL?

查看:137
本文介绍了为什么Apache的mod_rewrite重写我的两次网址是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要重写/管理/页/创建网址/backend/www/index.php/page/create,所以我用接下来的Apache重写规则和条件:

 的RewriteCond%{REQUEST_URI}!-f
的RewriteCond%{REQUEST_URI}!-d
的RewriteCond%{REQUEST_URI}!后端\\ / WWW重写规则管理\\ /(。*)$后端/ WWW / index.php文件/ $ 1 [NS,L]

然而,检查日志重写,我看到阿帕奇重写正确的URL,但最终它执行额外的考虑重写/页/创建网址,至极不符合任何条件,所以它失败,我收到未指定输入文件。错误。

我如何prevent Apache来执行额外的重写?我用NS标志和的RewriteCond%{} IS_SUBREQ F的条件,同时也执行子请求。

感谢您!

  80.29.4.44  -   -  [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (2)初始重写引擎与请求的URI /管理/页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](1)通过/管理/页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](3)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/]添加路径信息后缀:/home/daniloaz/dev.daniloaz.com/httpdocs/admin - > /home/daniloaz/dev.daniloaz.com/httpdocs/admin/page/create
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](3)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/]带每DIR preFIX:/home/daniloaz/dev.daniloaz.com/httpdocs/admin/page/create - >管理/页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](3)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/]应用模式为'admin \\ /(。*)$'到URI管理/页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](4)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/] RewriteCond指令:输入='/管理/页/创建'模式= - =>'F!匹配
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](4)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/] RewriteCond指令:输入='/管理/页/创建'模式= - =>D!匹配
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](4)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/] RewriteCond指令:输入='/管理/页/创建'模式='!后端\\ / WWW'=>匹配
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](4)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/] RewriteCond指令:输入='/管理/页/创建'模式='((管理员\\ /(*)$)|(ADMIN $)。)'=>匹配
80.29.4.44 - - [13 /六月/下一篇:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](4)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/] RewriteCond指令:输入='假'模式='F'=>匹配
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](2)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/]改写为'admin /页/创建' - > 后端/ WWW / index.php文件/页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](3)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/]添加每DIR preFIX:后端/ WWW / index.php文件/页/创建 - > /home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php/page/create
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](2)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/]带DOCUMENT_ROOT preFIX:/home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php/page/create - > /backend/www/index.php/page/create
80.29.4.44 - - [13 /六月/下一篇:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial](1)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/]内部重定向与/backend/www/index.php/page/create [内部重定向]
80.29.4.44 - - [13 /月/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1](2)INIT重写与要求的发动机URI /backend/www/index.php/page/create
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1](1)通过/后端/ WWW / index.php文件/页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1](3)[perdir /家/ daniloaz / dev.daniloaz.com / httpdocs资料/]添加路径信息后缀:/home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php - > /home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php/page/create
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1](3)[perdir /家/ daniloaz / dev.daniloaz.com / httpdocs资料/]条每DIR preFIX:/home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php/page/create - >后端/ WWW / index.php文件/页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1](3)[perdir /家/ daniloaz / dev.daniloaz.com / httpdocs资料/]应用模式为'admin \\ /(。*)$'到URI后端/ WWW / index.php文件/页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1](1)[perdir /家/ daniloaz / dev.daniloaz.com / httpdocs资料/]通过/home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a4ce60/subreq](2)初始重写引擎与请求的URI /页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a4ce60/subreq](1)通过/页/创建
80.29.4.44 - - [13 /俊/ 2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a4ce60/subreq](1)[perdir /家庭/ daniloaz的/ dev。 daniloaz.com/httpdocs/]通过/home/daniloaz/dev.daniloaz.com/httpdocs/page


解决方案

好吧,我终于解决了使用一种解决方法这个问题。首先,我试过这些解决方案的,但被一次又一次地进行子请求并在重写失败。

使用mod_rewrite的,也有小的差异,如果你把一个规则在.htaccess或在全局配置(httpd.conf中,虚拟主机的配置等)。子请求是那个区别之一。只需把我的虚拟主机配置文件,而不是的.htaccess上述相同的规则和子查询停止,一切都开始像一个魅力的工作。

我建议这个有用的帖子在试图解决任何与此相关的问题之前,充分了解了mod_rewrite的内部:<一href=\"http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/\">http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/

I need to rewrite /admin/page/create URL to /backend/www/index.php/page/create, so I use the next Apache rewrite rule and conditions:

RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI} !backend\/www

RewriteRule admin\/(.*)$ backend/www/index.php/$1 [NS,L]

However, examining the rewrite log, I see Apache rewrites correctly the URL, but at the end it performs an additional rewrite considering /page/create URL, wich doesn't match any condition, so it fails and I receive the "No input file specified." error.

How can I prevent Apache to perform that additional rewrite? I used NS flag and "RewriteCond %{IS_SUBREQ} f" condition and it also performs the subrequest.

Thank you!

80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (2) init rewrite engine with requested uri /admin/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (1) pass through /admin/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (3) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] add path info postfix: /home/daniloaz/dev.daniloaz.com/httpdocs/admin -> /home/daniloaz/dev.daniloaz.com/httpdocs/admin/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (3) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] strip per-dir prefix: /home/daniloaz/dev.daniloaz.com/httpdocs/admin/page/create -> admin/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (3) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] applying pattern 'admin\/(.*)$' to uri 'admin/page/create'
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (4) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] RewriteCond: input='/admin/page/create' pattern='!-f' => matched
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (4) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] RewriteCond: input='/admin/page/create' pattern='!-d' => matched
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (4) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] RewriteCond: input='/admin/page/create' pattern='!backend\/www' => matched
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (4) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] RewriteCond: input='/admin/page/create' pattern='((admin\/(.*)$)|(admin$))' => matched
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (4) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] RewriteCond: input='false' pattern='f' => matched
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (2) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] rewrite 'admin/page/create' -> 'backend/www/index.php/page/create'
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (3) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] add per-dir prefix: backend/www/index.php/page/create -> /home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (2) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] strip document_root prefix: /home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php/page/create -> /backend/www/index.php/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a35d60/initial] (1) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] internal redirect with /backend/www/index.php/page/create [INTERNAL REDIRECT]
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1] (2) init rewrite engine with requested uri /backend/www/index.php/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1] (1) pass through /backend/www/index.php/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1] (3) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] add path info postfix: /home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php -> /home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1] (3) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] strip per-dir prefix: /home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php/page/create -> backend/www/index.php/page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1] (3) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] applying pattern 'admin\/(.*)$' to uri 'backend/www/index.php/page/create'
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a472f0/initial/redir#1] (1) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] pass through /home/daniloaz/dev.daniloaz.com/httpdocs/backend/www/index.php
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a4ce60/subreq] (2) init rewrite engine with requested uri /page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a4ce60/subreq] (1) pass through /page/create
80.29.4.44 - - [13/Jun/2013:21:40:54 +0200] [dev.daniloaz.com/sid#7f65e59b6a78][rid#7f65e5a4ce60/subreq] (1) [perdir /home/daniloaz/dev.daniloaz.com/httpdocs/] pass through /home/daniloaz/dev.daniloaz.com/httpdocs/page

解决方案

Well, I finally solved this issue using a workaround. First I tried these solutions, but subrequests were performed again and again and rewriting failed as before.

With mod_rewrite, there are small differences if you put a rule in .htaccess or in global configuration (httpd.conf, Virtualhost configuration, etc.). Subrequests are one of that differences. Just place the same rule I mentioned above in Virtualhost config file instead of .htaccess and subqueries stop and everything starts working like a charm.

I recommend this useful post to fully understand the internals of mod_rewrite before trying to solve any related to it issue: http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/

这篇关于为什么Apache的mod_rewrite重写我的两次网址是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆