0

我正面临一种非常奇怪的行为,希望得到您的帮助以及解决方案或解释。

我确实在页面上使用了一个非常简单的代码:

// start a session
if( !session_id() )
  session_start('');

// write current url in session to prepare redirect after login
$_SESSION['url_before_login'] = $_SERVER['REQUEST_URI'];

在同一页面上,我确实加载了一个当前缺少的图标。因此,在浏览器的控制台上,我收到以下错误消息:

GET https://my.domain.ltd/assets/favicon/apple-touch-icon.png [HTTP/2 404 Not Found 141ms]

这可以。但是,奇怪的行为是,我的变量$_SESSION['url_before_login']没有$_SERVER['REQUEST_URI']我的页面,而是$_SERVER['REQUEST_URI']丢失的文件。当我输出时,$_SESSION['url_before_login']我得到/assets/favicon/apple-touch-icon.png而不是/folder/sub-folder/. 如果没有加载错误并且没有丢失文件,则会$_SESSION['url_before_login']向我显示正确的 URI。

有谁知道这种行为并且有一个解决方案如何解决这个问题(除了确保没有丢失的文件;-))。

4

2 回答 2

0

我猜你有一个.htaccess文件将所有请求重新路由到 PHP 文件,这意味着对于每个请求,你的会话变量都会被重写:

/* even a 404 favicon request triggers this line... */
$_SESSION['url_before_login'] = $_SERVER['REQUEST_URI'];

浏览器对网站图标提出了多个请求,您无法阻止这种情况,因此如果一切都通过相同的脚本,这将干扰您的会话变量。

所以,你有一些选择:

一个。您更改您的.htaccess文件,以便“favicon”的所有请求都被重定向到另一个路径所以 搜索:redirect favicon request

湾。将您的 PHP 文件更改为以下内容:

/* check if this is a request for favicon */
if (strpos($_SERVER['REQUEST_URI'], "favicon") !== false))
  exit;

// else, continue script...
$_SESSION['url_before_login'] = $_SERVER['REQUEST_URI'];

C。在您的服务器上放置一些 favicon,或使用 hack: SO:如何防止 favicon.ico 请求?

于 2020-10-15T17:08:09.270 回答
0

感谢@verjas 花时间写下答案。favicon 只是一个例子。由于其他可能丢失的文件,我必须防止这种行为。我编写了一个 WordPress 插件,可能是其他插件中缺少文件或主题超出了我的控制范围。

我的 htaccess 非常基础

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

所以,我认为这不是这种行为的原因。

您还有其他想法如何防止这种情况吗?

再次感谢您的时间和想法。

于 2020-10-19T11:11:43.063 回答