2009-08-05 20 views
5

Có cách nào để tôi làm cho nó hoạt động để bất kỳ ai nhấn F5 hoặc nút làm mới sẽ được chuyển sang một trang khác, thay vì làm mới trang mà người dùng muốn?Dừng mọi người làm mới trang

Cái gì như:

If (refresh){ 

    goto "link to hopme page" 

} 

Nếu không phải là có anyway cho tôi để không cho phép làm mới trên một trang nhất định?

Tôi có một số người chỉ làm mới không ngừng và nó đang giết chết băng thông của tôi. Nó là một trang web trò chơi vì vậy tôi không muốn cấm của ip.

+0

Tại sao? Bạn đang cố gắng chống lại các biến POST gửi lại? Sử dụng AJAX. –

+0

Bạn có nghĩa là khi mọi người làm mới trang hoặc CHỈ khi họ làm mới trang bằng cách nhấn F5? Làm rõ – colithium

+2

Tại sao bạn muốn làm điều này? – Randell

Trả lời

8
session_start(); 
if($_SESSION['hasbeenhere'] == 1) 
{ 
// Page refreshed 
} 
else 
{ 
    $_SESSION['hasbeenhere'] = 1; 
} 

Nếu người đó không bật cookie, điều này sẽ không thành công. Nếu ai đó truy cập một trang khác và quay lại, trang đó sẽ được hiển thị là được làm mới.

Nhìn chung, bạn không thể làm điều này theo cách chắc chắn, nhưng đây là 1 cách để ngăn người khác nhìn thấy cùng một trang hai lần.

Vì nhận xét của bạn, nếu bạn muốn ngăn mọi người nhấn F5 200 lần, hãy thử điều này.

$page = $_SERVER['REQUEST_URI']; 
// Defaults 
if(!isset($_SESSION[$page]['count'])) 
{ 
    $_SESSION[$page]['count'] = 1; 
    $_SESSION[$page]['first_hit'] = time(); 
    $_SESSION[$page]['banned'] = false; 
} 
else 
{ 
    $_SESSION[$page]['count']++; // Increase the counter 
} 

// If person is banned, end script 
if($_SESSION[$page]['banned'] == true) 
{ 
    die(); 
} 

if($_SESSION[$page]['first_hit'] < time() - 30) 
{ 
    $_SESSION[$page]['count'] = 1; // Reset every 30 seconds 
} 

if($_SESSION[$page]['count'] > 100) 
{ 
    $_SESSION[$page]['banned'] = true; 
    // Ban if they hit over 100 times in 30 seconds. 
} 
+0

Nếu họ truy cập một trang khác và sau đó quay trở lại trang này thì số lượng sẽ tăng lên? hoặc là điều này chỉ để làm mới? vì tôi không ngại họ chuyển sang trang khác và sau đó quay lại –

+0

Điều này chỉ hoạt động đối với trang hiện tại, hãy để tôi sửa đổi nó –

+0

Ở đó, hãy thử điều đó. Nó có thể cần một chút sửa đổi, nhưng tất cả những điều cơ bản là có. –

3

Tại sao bạn muốn?

Nhưng không, không có cách nào hoạt động liên tục có thể ngăn chặn điều này.

+0

Tôi có một số người đang chỉ cần nhấn nút F5 không ngừng và nó đang giết chết băng thông của tôi –

+1

Sau đó cấm những địa chỉ IP –

+0

Có rất nhiều và tôi muốn hầu hết trong số họ này là cho một trang web trò chơi. –

1

Tôi không biết liệu điều này có hiệu quả hay không, nhưng bạn có thể nghe các lần nhấn phím bằng javascript hay không, và nhấn phím F5, hãy làm những gì bạn muốn.

0

Tôi đoán bạn có thể làm điều này:

session_start(); 

if (isset($_SESSION['visited'])) { 
    header("Location: http://the.page/you/want"); 
} else { 
    $_SESSION['visited'] = true; 
} 
0

Để ngăn chặn F5 từ sảng khoái, bạn phải không cho phép làm mới của bất kỳ loại. Là một hack, bạn có thể thử đặt dấu thời gian trong chuỗi truy vấn. Khi tải, bạn có thể kiểm tra giá trị của dấu thời gian và nếu nó là trong quá khứ, chuyển hướng đến một trang khác. Điều này sẽ hoạt động nếu cookie bị tắt.

+0

** @ sideproject: ** Vì thời gian liên kết sẽ được xây dựng sẽ luôn trong quá khứ so với thời gian liên kết được nhấp, điều này sẽ không hoạt động. –

+0

Đồng ý. Tốt nhất để đi với một giải pháp khác. – sideproject

0

Trang web thực hiện điều này bằng Javascript, vì vậy khi bạn đang chỉnh sửa nội dung nào đó, bạn không mất nó bằng cách làm mới, quay lại, v.v. Có thể một số sự kiện được xác định bởi JQuery cho phép bạn thực hiện việc này, vì vậy hãy xem xét và trên sự kiện đó, chuyển hướng đến trang bạn muốn (có thể phải nằm trong cùng một tên miền).

12

Có lẽ bạn nên tập trung nỗ lực của mình thay vì giảm băng thông mà trang của bạn đang sử dụng. Khám phá các lĩnh vực nén ảnh, tối ưu hóa trang và lưu vào bộ nhớ đệm.

+0

Tôi đang làm việc trên đó là tốt nhưng tôi cần một giải pháp cho bây giờ. –

+2

Cuộc gọi tốt. Nếu máy chủ của bạn đang sử dụng máy chủ Apache, rất có khả năng bạn sẽ có 'mod_deflate' và' mod_gzip' theo ý của bạn. Được cấu hình đúng, chúng sẽ nén nội dung văn bản (như HTML, Javascript, CSS). Nếu bạn đang sử dụng PHP, có lẽ có một cái nhìn tại 'ob_start (" ob_gzhandler ");'. – Gav

3

Trong mã PHP của bạn, làm như sau:

if(isset($_SESSION["pagename-LAST_VIEWED"])) { 
    v = $_SESSION["pagename-LAST_VIEWED"]) 
    if(time() - v < 15) { 
     // user is refreshing more than once per 15 seconds 
     // send them something else and die 
     } 
} 
$_SESSION["pagename-LAST_VIEWED"] = time(); 

Hãy bỏ qua dể thương của tôi pseudo-PHP, nó không phải là ngôn ngữ hàng ngày của tôi.

Điều này sẽ ngăn cả làm mới trang (F5) người dùng chỉ cần nhấp lại vào dấu trang hoặc nhấn Enter trong thanh địa chỉ một lần nữa.

Bạn cũng có thể bật một số thẻ meta và tiêu đề HTTP bộ nhớ đệm tích cực, điều này sẽ ngăn không cho làm mới một số làm không bao giờ đánh máy chủ của bạn, nhưng mã trên phải khá dễ mở rộng.

Một điều cần xem xét: vấn đề gốc là mã khác của bạn, không phải là người dùng của bạn. Cân nhắc viết lại trang của bạn để nó tự động cập nhật phần họ muốn xem qua AJAX theo thời gian trễ. Điều này sẽ cung cấp cho họ sự khuyến khích không sử dụng Làm mới và sẽ giúp máy chủ của bạn đối phó bằng cách chỉ phải làm mới một chút dữ liệu mà họ muốn xem cập nhật.

0

Dường như với tôi rằng không có giải pháp kỹ thuật tốt cho vấn đề này (các câu trả lời khác được bảo hiểm khá tốt). Nếu người dùng liên tục nhấn làm mới trên trang này, tôi đoán đó là vì họ mong đợi trang thay đổi và họ muốn thông tin cập nhật. Có lẽ bạn nên lấy đi lý do của họ vì muốn làm mới trang. Cách dễ nhất để làm điều này có lẽ sẽ làm cho bản cập nhật trang (có thể thông qua AJAX). Vì vậy, người dùng có thể ngồi ở đó và các bản cập nhật sẽ chỉ cuộn vào - không có thêm búa F5, điều này sẽ cắt giảm băng thông của bạn, chưa kể đến trải nghiệm người dùng tốt hơn.

0

Nó không trả lời câu hỏi của bạn trực tiếp nhưng bạn có thể giải quyết vấn đề của bạn với bộ đệm ẩn phải không?

Nếu bạn gửi tiêu đề Cache-Control: công khai, max-age = 120 Điều đó sẽ hướng dẫn trình duyệt không cần yêu cầu lại trang trong 2 phút và chỉ có thể sử dụng bản sao từ bộ nhớ cache . Nếu khóa học họ có thể sử dụng control-f5 để buộc làm mới nhưng nó phải giúp đỡ rất nhiều?

0

Tôi chỉ tìm ra một giải pháp rất đơn giản.

Đối với tôi sau khi tôi xử lý tất cả các thông tin $ _POST và lưu những cái tôi cần vào một var $ _SESSION tôi làm điều này:

$_SESSION['admin']['PID']=session_id(); 
$_SESSION['admin']['user_user']=$_POST['user']; 
$_SESSION['admin']['user_pass']=$_POST['pass']; 
$_SESSION['admin']['last_access_time']=time(); 
if($_SERVER['REQUEST_METHOD']==="POST") 
{ 
    header("LOCATION:".$_SERVER['PHP_SELF']."?p=redirected"); 
} 

Trong trường hợp của tôi, tôi đã cố gắng để chứng thực người dùng, và tôi có vấn đề là khi ai đó đăng xuất và quay trở lại và làm mới tải trang web một lần nữa, và với điều này đơn giản nếu tôi cuối cùng đã giải quyết nó.

PD:. "? P = chuyển hướng" chỉ dành cho thử nghiệm porpouse

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