2010-06-26 38 views
9

Tôi có tài liệu HTML, tải nội dung từ tệp PHP bằng cách sử dụng cuộc gọi AJAX. Bit quan trọng của mã của tôi là dưới đây:Phát hiện URL gọi Ajax

default.html:

/*more code above*/ 
var PHP_URL = "content.php"; 
var Content = document.getElementById('Content'); 
ajaxRequest = new XMLHttpRequest(); 
ajaxRequest.onreadystatechange = 
    function() { 
     if(ajaxRequest.readyState==4) { 
      if (ajaxRequest.status==200) 
       Content.innerHTML = ajaxRequest.responseText; 
      else 
       Content.innerHTML = "Error:<br/>unable to load page at <b>"+PHP_URL+"</b>"; 
      Content.className = "Content Solid"; 
     } 
    } 
ajaxRequest.open("GET",PHP_URL,true); 
ajaxRequest.send(); 
/*more code below*/ 

Có thể cho các tập tin ở 'content.php' để phát hiện rằng nó đã được gọi từ 'default.html ', hoặc một tài liệu gọi điện khác khi cần thiết?

Trả lời

13

Hầu hết nổi tiếng khung Ajax như jQuery và mooTools thêm tiêu đề cụ thể mà bạn có thể kiểm tra bằng PHP:

if (strcasecmp('XMLHttpRequest', $_SERVER['HTTP_X_REQUESTED_WITH']) === 0) 
{ 
    // Ajax Request 
} 
1

$_SERVER['HTTP_REFERER'] có thể là những gì bạn muốn

Reference

+1

Bạn không thể dựa vào HTTP_REFERER luôn được lấp đầy. – Sjoerd

+0

Đồng ý - nhưng chỉ khác thay thế tôi có thể nghĩ đến là tạo ra một hash duy nhất được lưu trữ trong phiên và bao gồm nó trong yêu cầu AJAX sau đó kiểm tra phiên của người dùng để xem nó đến từ đâu. Đó là loại xấu xí và có lẽ quá mức cần thiết. –

0

Nó không thể chỉ đơn giản là phát hiện rằng một yêu cầu đến từ một cuộc gọi AJAX trên máy chủ. Tuy nhiên, bạn có thể thêm một tham số mà bạn gửi khi yêu cầu thông qua AJAX cho biết nó đến từ một cuộc gọi ajax.

Ví dụ:

/*more code above*/ 
var PHP_URL = "content.php?mode=AJAX"; 
var Content = document.getElementById('Content'); 
ajaxRequest = new XMLHttpRequest(); 
ajaxRequest.onreadystatechange = 
    function() { 
     if(ajaxRequest.readyState==4) { 
      if (ajaxRequest.status==200) 
       Content.innerHTML = ajaxRequest.responseText; 
      else 
       Content.innerHTML = "Error:<br/>unable to load page at <b>"+PHP_URL+"</b>"; 
      Content.className = "Content Solid"; 
     } 
    } 
ajaxRequest.open("GET",PHP_URL,true); 
ajaxRequest.send(); 
/*more code below*/ 

Nếu chỉ đơn giản là phát hiện các cuộc gọi đến từ default.html là đủ (và không phân biệt giữa một cuộc gọi AJAX hoặc một liên kết nhấp), sau đó kiểm tra các tiêu đề Người giới thiệu sẽ làm các trick , theo đề xuất của @Jamie Wong.

2

Tôi đoán tốt nhất là để thiết lập một tiêu đề yêu cầu trong cuộc gọi AJAX của bạn, chẳng hạn như

st.setRequestHeader('X-Sent-From','default.html') 

sau đó trong content.php,

$sentFrom=$_SERVER['HTTP_X_SENT_FROM']; // outputs default.html 
+0

Đã không nghĩ về điều đó - trong jQuery, bạn sẽ sử dụng gọi lại 'beforeSend' để làm điều này, hoặc là có một cách dễ dàng hơn? –

+0

Tôi sử dụng jQUery rất nhiều, nhưng không phải cho các cuộc gọi AJAX. tuy nhiên, với kiến ​​thức của tôi, tôi sẽ sử dụng beforeSend – fabjoa

Các vấn đề liên quan