前端加载mod_rewrite规则导致index.php加载两次

问题描述 投票:0回答:3

我一直在开发一个使用前端加载器来处理所有请求的项目(将domain.com/args/go/here路由到Index.php?req=args/go/here),并且效果非常好......或者我应该说,我认为确实如此 - 我最近添加了一个新的记录器,为了测试它,我在 index.php 中放置了一条测试日志消息。每次我重新加载页面时,这条消息都会被写入我的日志文件两次,经过多次调试后,我发现原因是我的 .htaccess 文件 - 无论出于何种原因,它都会为每个请求加载 index.php 两次。

这是我的.htaccess:

RewriteEngine On
RewriteBase /site/beta/ #I added this after I discovered the bug
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^index\.php$ #This too. Doesn't work
RewriteRule ^(.*)$ index.php?args=$1 [L]

我也尝试过:

FallbackResource /site/beta/index.php

两者都不起作用(如果您尝试访问 127.0.0.1/site/beta/admin/controls/,则 Index.php 不会加载 - 但如果您只是访问 /index.php,则它会加载) ),并且仍然加载两次。

有人可以帮助我吗?我在 IRC 上呆了几个小时,但没有人能想出一个有效的解决方案。 (仅推荐以上两种)

apache mod-rewrite
3个回答
6
投票

您完全确定这是 mod_rewrite 错误吗?如果您启用具有高 rewriteLogLevel (9) 的 RewriteLog 文件,您是否会看到相同的请求被处理了 2 次?

对我来说,每次看到“相同的请求完成两次”,我都会想到另一个奇怪的网络错误:空的 IMG src bug

如果您的 HTML 中存在

<IMG SRC="">

或者在其中一个CSS(更难找到)a:

url()

那么你就明白了。 HTTP 协议规定,空的 GET url(CSS 中的图像或 url() 是 GET 隐式请求)必须是对与呈现原始页面的 URL 相同的 url 的调用(并且它也可以是 POST,如果您可以通过 POST 请求获取页面)。

确实没有理由让 mod_rewrite 对一个请求响应两次。检查 Firebug 或 LiveHTTP Requests 是否总是发送 index.php 请求 2 次。或者使用 telnet 模式 HTTP 请求手动测试您的服务器,因为这肯定只会发送一个请求。


1
投票

这也可能是浏览器尝试加载(除非您检查 apache 访问日志,否则看起来是不可见的)favicon.ico。我遇到了同样的问题,直到我将一个问题放入我的网站根目录中。我知道最初提问者的问题已得到解决,我将其放在这里是为了像我这样正在寻找同一问题答案的人。


0
投票

老问题,但添加它,因为这是一个问题。

如果您正在使用 mod_rewrite 并且所有内容都指向索引页面,则您很可能也会收到指向索引的网站图标请求,从而导致页面重新加载。

将 htaccess 文件中的“/favicon.ico”列入白名单以消除此问题。

© www.soinside.com 2019 - 2024. All rights reserved.