2011-05-10 140 views
6

我形我页两种不同的RewriteRules:重写规则会导致页面重新加载两次

# Enable URL Rewriting 
RewriteEngine on 

# exclude followed stuff 
RewriteRule ^(js|img|css|favicon\.ico|image\.php|anprobe|content|libs|flash\.php|securimage)/ - [L,QSA,S=2] 

# conditions (REQUEST dont point @ file|dir|link) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-F 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 

# rules 
RewriteRule ^(?!index\.php)brillen/(.*(brillen)|360|neu)/(.*)([a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}(?!\.))(.*)$  /index.php/brillen/$1?art_id=$4&$5&%{QUERY_STRING}  [NS,QSA,L] 
RewriteRule ^(?!index\.php)(.*)$               /index.php/$1         [NS,QSA,L] 

...我现在遇到一个奇怪的问题,就在于每个请求导致页面内加载了两次,这导致数据库操作和电子邮件分派也被执行两次的问题。

有没有人有关于此的想法?

在此先感谢!

注1:根据浏览器的资源跟踪,所有请求的资源都是有效的和可用的。

注2:问题可能起源于保留和后处理PATH_INFO? (/index.php/$1=> /index.php/foo/bar/...)

+0

是什么让你觉得每个页面加载两次? – qbert220 2011-05-10 10:36:18

+0

正如我所提到的:数据库操作和电子邮件分派执行两次...我通过发射一些syslog来验证我的假设,它也出现两次。 – proximus 2011-05-10 10:43:03

+0

错误的来源是一些PHP代码被调用两次......对我感到羞耻! :( – proximus 2011-05-10 11:20:08

回答

8

重写引擎无法使单个HTTP请求运行两次。它将Apache的HTTP请求路由到静态文件,代理函数或模块(如PHP),并请求发生变化。但它不能克隆请求,并给它2次到Apache。

当你有任何“运行两次”的问题的机会是,你是由空图像网址错误。事实上,它不是一个真正的错误,它是HTML的一个特性(至少在HTML5之前)以及url解析的一个特性。

如果你得到某个地方空GET URL,HTML指出浏览器应该重新发送相同的查询(给他当前页的那个)相同的参数。这可以使POST请求发生2次(如果请求的第一页是POST)。那么这些空的GET网址在哪里?大多数时候,你可以:

<IMG SRC="" ...> (in the HTML) 

或:

url() (in the css) 

或:

<script type="text/javascript" src=""></script> 
<link rel="stylesheet" type="text/css" href=""> (in the HTML headers) 

读也@乔恩回答有关图标查询。您应该始终使用wget或telnet 80查询来测试结果而无需浏览器行为。

更新:详细解释和跟进this blog与HTML5添加应该删除这种行为的现代浏览器。

+0

我三重检查了所有资源,并搜索了你提到的模式,但它们都不适用...甚至在浏览器(js)控制台上没有输出。 – proximus 2011-05-10 10:05:35

+0

在网络扫描上的萤火虫上,你没有看到第二个html请求?如果你用lynx或telnet尝试你会得到第二个执行吗? – regilero 2011-05-10 10:35:48

+0

没有第二个请求在firebug中可见。第二个请求实际上对用户是不可见的,似乎只是在内部完成(因此它是只有在我的系统日志中才可以看到)使用lynx调用页面时也是如此 – proximus 2011-05-10 10:53:22

1

我有同样的问题(或者我认为)。这是由favicon.ico的请求引起的,我在重写规则中没有考虑到这一点。

1

我有同样的问题,造成的,因为我做了一些URL重写,而剧本中加载了两次,由于这样的事实,我没有补充一点:

RewriteRule ^(js|img|css|favicon\.ico)/ - [L,QSA,S=2] 

这将从停止脚本被加载两次;它解决了我的问题。