RewriteRule导致页面重新加载两次

时间:2011-05-10 09:34:57

标签: apache mod-rewrite url-rewriting

我为我的页面塑造了两个不同的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]

...我遇到了一个奇怪的问题,这个问题在于导致页面内部加载两次的每个请求,这导致db动作和电子邮件调度也被执行两次的问题。

有没有人对此有所了解?

提前致谢!

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

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

3 个答案:

答案 0 :(得分:8)

重写引擎无法使单个HTTP请求运行两次。它将Apache的HTTP请求路由到静态文件,代理函数或模块(如PHP),并在请求中进行更改。但它无法克隆请求并将其提供给apache两次。

如果您遇到“两次运行”问题,可能会遇到空图片网址错误。事实上,它不是一个真正的错误,它是HTML的一个特性(至少在HTML5之前)和url-parsing的一个特性。

如果你到达空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)

另请阅读@Jon关于favicon查询的回答。您应该始终使用wget或telnet 80查询来测试没有浏览器行为的结果。

更新详细解释this blog上提供的解释和后续操作,其中添加了HTML5,这些内容可以消除现代浏览器的这种行为。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我有同样的问题,因为我做了一些url重写,并且脚本被加载了两次,因为我没有添加这个:

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

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