Я расширял скрипт php, который проверяет, включен ли javascript, чтобы перезагружать его после второго раза (когда js кажется выключенным). Вот ссылка на оригинальный скрипт php от erm3nda. Как видно из его фрагмента, при первой загрузке страницы скрипт (более того, «вызывающий») печатает тег script с запросом jquery ajax на той же странице, но с $_GET
заголовок, который попадает на ту же страницу, загруженную в фоновом режиме (более того, называемый «скрипт»), и устанавливает $_SESSION
переменная к 1. После того, как вызываемый скрипт завершает свою работу в фоновом режиме, вызывающая сторона перезагружается (и снова повторяет этот ajax-запрос), пока не сможет найти одноименный $_SESSION
переменная, которая должна быть установлена в 1. Если это не так, она завершается во время процесса перезагрузки с «javascript is disabled», если она была установлена на 1, она завершается с «javascript is enabled». Я начал изменять этот код, чтобы перестать перезагружать страницу после того, как она уже однажды перезагрузилась. Поэтому в настоящее время я использую этот скрипт:
test.php
<html><body><?php
header('Content-Type: text/html; charset=utf-8');
ini_set('display_errors', 1);
ini_set('log_errors',1);
ini_set('display_startup_errors', 1);
ini_set('error_reporting', E_ALL);
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
function start_session() {
if(version_compare(phpversion(), "5.4.0") != -1){
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
} else {
if(session_id() == '') {
session_start();
}
}
}
start_session();
if (!isset($_SESSION['js']) && !isset($_REQUEST['sessionstart']) && !isset($_REQUEST['setjsoff']) && !isset($_SESSION['jsoff'])) {
echo '<script src="./js/jquery.js"></script><script type="text/javascript">$(document).ready(function(){$.get(document.URL.substring() + "?sessionstart=1");});</script>';
}
if (isset($_REQUEST['sessionstart'])) {
$_SESSION['js'] = 1;
exit("in sessionstart mode");
} else {
if (isset($_REQUEST['setjsoff'])) {
$_SESSION['jsoff'] = 1;
if ($_SESSION['jsoff'] == 1) {
exit("in setjsoff mode (success)");
} else {
exit("jsoff unsuccessful");
}
} else {
session_destroy();
}
}
if (!isset($_SESSION['js'])) {
if (!isset($_SESSION['jsoff'])) {
if (!isset($_REQUEST['sessionstart'])) {
$ch = curl_init();
$username = "***";
$password = "***";
curl_setopt($ch, CURLOPT_URL, "***/test.php?setjsoff=1");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$chout = curl_exec($ch);
curl_close($ch);
echo "curl init - ".$chout." - ";
}
header("Refresh: 1");
exit("301 Redirect");
}
echo "Javascript is not enabled";
} else {
echo "Javascript is enabled";
}
?></body></html>
(конфиденциальная информация была заменена ***
)
При включенном javascript этот сценарий в настоящее время функционирует должным образом: он загружается, перезагружается один раз, и вызывающая сторона выдает «javascript включен».
Без включенного JavaScript, вызывающая сторона загружает, перезагружает и выводит эту информацию во время перезагрузки (намеренно): «curl init - HTTP/1.1 200 OK Date: *** GMT Server: Apache X-Powered-By: PHP/5.6.36 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: PHPSESSID=***; path=/ Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 in setjsoff mode (success) - 301 Redirect
».
(конфиденциальная информация была заменена ***
)
Как видите, вывод делится на 3 части:
— curl init
сигнализирует, что завиток инициирован (не выводит ошибку)
— the header information of the called page via curl + output of that page
— 301 redirect
сигнализирует, что страница была полностью выполнена и собирается перезагрузить
Заголовок является наиболее важным полученным сообщением, поскольку он в основном раскрывает то, что произошло в фоновом режиме. Кажется, что curl называется страницей, страница возвращается in setjsoff mode (success)
(что означает, что он установлен $_SESSION['js']
1) и очень много информации заголовка, которую я не могу интерпретировать.
Здесь (наконец-то) моя проблема: страница продолжает перезагружаться после этого (поэтому переменная сеанса была как-то потеряна?). Раскрывает ли информация в заголовке какие-либо проблемы, или я забыл установить важную опцию через curl_setopt
?
Основная проблема в том, что вы не на самом деле перезагрузка страницы. Вы можете быть причиной сервер перейти на ту же страницу, но это совершенно другой сеанс по сравнению с исходным сеансом клиента, который ее инициировал. Кроме того, вы не указываете банку печенья для curl, так что даже если вы мог умудриться оправиться от этого, твоя сессия & связанные куки с сервера при вызове теряются.
Первый пункт, однако, является фундаментальной проблемой: вы пытаетесь сделать что-то, что вам даже не следует рассматривать. К счастью, спецификация HTML предлагает вам <noscript>
элемент, с которым вы можете работать.
Так что просто испустите что-то вроде этого:
<script type="text/javascript">/*<![CDATA[*/
/* JS code goes here */
/*]]>*/</script>
<noscript>
<!--
- hit a PHP endpoint that returns a static resource you can hide
- that PHP script can adjust the session as necessary.
-->
<img src="/dummy/image/script.php?jsoff=1"style="width:0px!important;height:0px!important;">
</noscript>
Еще лучше: почему бы просто не предположить, что JavaScript не доступен, а затем пересмотреть это, когда будет запущен отдельный скрипт PHP? Тогда вы можете просто связать статический <script>
ресурс в <head>
страницы … намного проще & гораздо более надежное решение в целом.
Других решений пока нет …