服务器加载网站每个页面加载 - session 完整性丢失
Server loads website each page load - session integrity is lost
到 re-evaluate 标题,如果我在浏览器中转到 localhost/
,页面会按您预期的方式加载,加载我尝试提供的任何内容都是按我的意愿完成的,不过我在使用 XDEBUG 调试时发现了一些奇怪的东西(这只是 PHP 的调试软件,用于观察调用了哪些函数以及加载的文件) - 有两个日志单次加载。
他们会加载整个应用程序两次,就好像加载了浏览器请求的页面然后服务器决定第二次加载它一样,为了好玩!
这是我在加载页面时所说的两个日志文件,使用 Webgrind
进行分析。
.favicon
是 Google Chrome 试图在每次加载时检索网站图标,据我所知,这将是第三次加载网站,尽管我使用了非法 URL 管理器在看到 /favicon.ico
的 URI 时从 运行 停止应用程序,因此应用程序现在只运行两次。
这是我目前用来操纵 URL 的 .htaccess
:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond !^(index\.php|robots\.txt)
DirectoryIndex index.php
RewriteRule ^(.*)$ index.php?/ [L]
我的 access.log
来自 apache:
::1 - - [09/Jan/2017:23:57:27 -0800] "GET / HTTP/1.1" 200 1597 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.51 Safari/537.36"
::1 - - [09/Jan/2017:23:57:28 -0800] "GET / HTTP/1.1" 200 1597 "http://localhost/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.51 Safari/537.36"
谢谢!
在我完成整个应用程序的调试后(将 SESSION 记录器放置在 index.php 页面,然后稍后修改 SESSION 值并查看正在请求的内容)在我的 index.php
页面上使用以下代码:
if (!isset($_SESSION['logs']) $_SESSION['logs'] = [];
array_push($_SESSION['logs'], [
'ip' => $_SERVER['REMOTE_ADDR'],
'ua' => $_SERVER['HTTP_USER_AGENT'],
'uri' => $_SERVER['REQUEST_URI'],
'tim' => time()
]);
(稍后使用print/echo "<pre>", print_r($_SESSION['logs']) ,"</pre>";
查看)
我可以看到除了奇数之外所有日志都是一样的
'uri' => '/favicon.ico'
表示 Google Chrome 正在从我的应用请求 favicon.ico
,所以我设置了一个临时的
if ($_SERVER['REQUEST_URI'] === '/favicon.ico') exit;
只是为了阻止该请求,并尝试将记录器降低到一个应用程序负载。
将请求限制为 2 个(均为 localhost/
)后,我查看了我的 access.log
文件,其中显示了两个相同的请求,但一个请求是 localhost/
另一个是 -
(-
= undefined
到日志记录),所以经过 24 小时的调试我记得有我以前看过的 Chrome 开发工具其中显示所有网络连接;
Chrome Dev Tools 显示了对 localhost
的两次调用,我认为这很奇怪,但发起者是 jQuery
(当时我不知道 $.get
AJAX 请求算作 jQuery
发起者,所以我忽略了它,直到最近我才意识到我在加载页面时有一个加载方法,它将请求当前 window.location.hash
在 GET
$.get( window.location.hash.substring(3), function(body) {} );
正在请求(加载 localhost/
时)...localhost/
,因为页面没有 hash
部分。
所以这一切都归结为有一个自动加载器,尽管我检查了整个应用程序中的每个 img
标记和 link rel
/ script
标记(200k 行代码)。
希望对大家有所帮助!他花了很多时间才弄明白这一点。
(抱歉现在是凌晨 2 点英语不好)
到 re-evaluate 标题,如果我在浏览器中转到 localhost/
,页面会按您预期的方式加载,加载我尝试提供的任何内容都是按我的意愿完成的,不过我在使用 XDEBUG 调试时发现了一些奇怪的东西(这只是 PHP 的调试软件,用于观察调用了哪些函数以及加载的文件) - 有两个日志单次加载。
他们会加载整个应用程序两次,就好像加载了浏览器请求的页面然后服务器决定第二次加载它一样,为了好玩!
这是我在加载页面时所说的两个日志文件,使用 Webgrind
进行分析。
.favicon
是 Google Chrome 试图在每次加载时检索网站图标,据我所知,这将是第三次加载网站,尽管我使用了非法 URL 管理器在看到 /favicon.ico
的 URI 时从 运行 停止应用程序,因此应用程序现在只运行两次。
这是我目前用来操纵 URL 的 .htaccess
:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond !^(index\.php|robots\.txt)
DirectoryIndex index.php
RewriteRule ^(.*)$ index.php?/ [L]
我的 access.log
来自 apache:
::1 - - [09/Jan/2017:23:57:27 -0800] "GET / HTTP/1.1" 200 1597 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.51 Safari/537.36"
::1 - - [09/Jan/2017:23:57:28 -0800] "GET / HTTP/1.1" 200 1597 "http://localhost/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.51 Safari/537.36"
谢谢!
在我完成整个应用程序的调试后(将 SESSION 记录器放置在 index.php 页面,然后稍后修改 SESSION 值并查看正在请求的内容)在我的 index.php
页面上使用以下代码:
if (!isset($_SESSION['logs']) $_SESSION['logs'] = [];
array_push($_SESSION['logs'], [
'ip' => $_SERVER['REMOTE_ADDR'],
'ua' => $_SERVER['HTTP_USER_AGENT'],
'uri' => $_SERVER['REQUEST_URI'],
'tim' => time()
]);
(稍后使用print/echo "<pre>", print_r($_SESSION['logs']) ,"</pre>";
查看)
我可以看到除了奇数之外所有日志都是一样的
'uri' => '/favicon.ico'
表示 Google Chrome 正在从我的应用请求 favicon.ico
,所以我设置了一个临时的
if ($_SERVER['REQUEST_URI'] === '/favicon.ico') exit;
只是为了阻止该请求,并尝试将记录器降低到一个应用程序负载。
将请求限制为 2 个(均为 localhost/
)后,我查看了我的 access.log
文件,其中显示了两个相同的请求,但一个请求是 localhost/
另一个是 -
(-
= undefined
到日志记录),所以经过 24 小时的调试我记得有我以前看过的 Chrome 开发工具其中显示所有网络连接;
Chrome Dev Tools 显示了对 localhost
的两次调用,我认为这很奇怪,但发起者是 jQuery
(当时我不知道 $.get
AJAX 请求算作 jQuery
发起者,所以我忽略了它,直到最近我才意识到我在加载页面时有一个加载方法,它将请求当前 window.location.hash
在 GET
$.get( window.location.hash.substring(3), function(body) {} );
正在请求(加载 localhost/
时)...localhost/
,因为页面没有 hash
部分。
所以这一切都归结为有一个自动加载器,尽管我检查了整个应用程序中的每个 img
标记和 link rel
/ script
标记(200k 行代码)。
希望对大家有所帮助!他花了很多时间才弄明白这一点。 (抱歉现在是凌晨 2 点英语不好)