我並不負責Apache的配置,所以我不確定我可以提供哪些有用的conf文本,但我相當肯定我有將問題縮小到登錄。 EventSource在XAMPP上本地完美工作,無需任何登錄,並且在生產服務器上進行身份驗證後刷新頁面,但服務器上的第一次加載只是不會打開連接。有沒有人見過這個問題?在搜索過去幾天之後,我在網上找不到任何東西。JavaScript的EventSource在Apache基礎驗證後不會打開連接
編輯:一些代碼
一些服務器端代碼(這主要是不應該是相關的):
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$client_stream = new RedisStream();
$client_stream->poll(1); //The loop, with sleep time as a parameter
中的JavaScript:
var xhttpViewSet;
var xhttpSearch;
var view = 'tile';
var search = '';
var seed_url = '/core/seed_view.php';
var stream_url = '/core/stream.php';
var default_class = 'panel-default';
var success_class = 'panel-success';
var warning_class = 'panel-warning';
var danger_class = 'panel-danger';
function UpdateClient(c_name, c_obj) {
if ((c_element = document.getElementById(c_name)) !== null) {
c_element.classList.remove('text-muted');
c_element.classList.remove(default_class);
c_element.classList.remove(success_class);
c_element.classList.remove(warning_class);
c_element.classList.remove(danger_class);
switch (c_obj['status']) {
case 0:
c_obj['status'] = 'OK';
c_element.classList.add(success_class)
break;
case 1:
c_obj['status'] = 'Warning';
c_element.classList.add(warning_class)
break;
case 2:
c_obj['status'] = 'Critical';
c_element.classList.add(danger_class)
break;
default:
c_obj['status'] = 'Unknown';
c_element.classList.add(danger_class)
break;
}
for (i in c_obj) {
var var_nodes = c_element.getElementsByClassName(i);
if (var_nodes.length > 0) {
for (var j = var_nodes.length - 1; j >= 0; j--) {
var_nodes[j].innerHTML = c_obj[i];
}
}
}
}
}
function SetView() {
var view_url = seed_url + '?search=' + search + '&view=' + view;
xhttpViewSet.open('GET', view_url, true);
xhttpViewSet.send();
}
var main = function() {
container = document.getElementById('content');
if (new XMLHttpRequest()) {
xhttpViewSet = new XMLHttpRequest();
xhttpSearch = new XMLHttpRequest();
} else {
xhttpViewSet = new ActiveXObject('Microsoft.XMLHTTP');
xhttpSearch = new ActiveXObject('Microsoft.XMLHTTP');
}
var stream = new EventSource(stream_url);
stream.onopen = function() {
console.log('Connection opened.'); //This doesn't fire
}
stream.onmessage = function(e) {
var c_obj = JSON.parse(e.data);
UpdateClient(c_obj.name, c_obj.value);
};
xhttpViewSet.onreadystatechange = function() {
if (xhttpViewSet.readyState == 4) {
var resp = xhttpViewSet.responseText;
if (xhttpViewSet.status == 200 && resp.length > 0) {
container.innerHTML = resp;
if (view == 'list') {
$('#computer-table').DataTable({
"lengthMenu": [[25, 50, 100], [25, 50, 100]]
});
}
} else {
container.innerHTML = '<error>No computers matched your search or an error occured.</error>';
}
}
}
SetView(); //This successfully does all but make the EventSource connection, and only fails to do that on first load
document.getElementById('list-view').addEventListener('click', function() {
view = 'list';
SetView();
});
document.getElementById('tile-view').addEventListener('click', function() {
view = 'tile';
SetView();
});
document.getElementById('search').addEventListener('keyup', function() {
search = this.value.toUpperCase();
SetView();
});
document.getElementById('clear-search').addEventListener('click', function() {
document.getElementById('search').value = '';
search = '';
SetView();
});
};
window.onload = main;
你將需要提供一些更多的細節。例如客戶端代碼,服務器代碼,您使用的URL ......繼續下去。其實,更重要的是:你在控制檯中看到了什麼?使用開發人員工具至少在兩個瀏覽器中進行測試。請注意重定向發生了什麼,發送了什麼頭文件等。 –
@DarrenCook我將更新以包含前端和後端代碼,但至於控制檯中發生了什麼:此刻沒有什麼有趣的內容。對於簡單的調試和連接計數,我一直在記錄「連接打開。「,並且登錄後不會立即顯示,所以我懷疑它是」onopen「不工作或創建EventSource對象本身;它是 - 並且應該仍然是 - 按原樣工作 –
您是否使用PHP會話除了登錄之外,生產系統和本地XAMPP系統還有什麼不同呢? 至於調試控制檯中的「無關緊要」,所有可能的結果都很有趣:例如,您看到auth頭文件被髮送,它告訴你一件事,或者你沒有看到它,它告訴你另一件事:-) –