2010-01-21 77 views
117

PHP có thể thực hiện cuộc gọi chuyển hướng sau khi thực hiện một hàm không? Tôi đang tạo một chức năng khi hoàn thành mà tôi muốn nó chuyển hướng đến một tập tin nằm trong cùng một thư mục gốc. Nó có thể được thực hiện?Chuyển hướng trang PHP

if { 
     //i am using echo here 
} 

else if ($_SESSION['qnum'] > 10) { 
      session_destroy(); 
      echo "Some error occured."; 
      //redirect to user.php 
     } 
+0

tôi serach về vấn đề này và tôi tìm thấy liên quan đến câu trả lời này trong http://stackoverflow.com/questions/13539752/redirect-function/13539808 – user1972007

Trả lời

216

Có, bạn sẽ sử dụng hàm header.

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */ 
exit(); 

Thực tiễn tốt là gọi exit() ngay sau đó để mã bên dưới không được thực thi.

Ngoài ra, từ các tài liệu:

Ghi tiêu đề đó() phải được gọi trước khi bất kỳ sản lượng thực tế được gửi đi, hoặc bằng thẻ HTML thông thường, dòng trống trong một tập tin, hoặc từ PHP. Đó là một lỗi rất phổ biến khi đọc mã có hàm include() hoặc require(), hàm hoặc một hàm truy cập tệp khác và có dấu cách hoặc dòng trống được xuất trước khi header() được gọi. Vấn đề tương tự tồn tại khi sử dụng một tệp PHP/HTML duy nhất.

Điều này có nghĩa là bạn không được lặp lại bất cứ điều gì ngay trước chức năng header(), vì làm như vậy sẽ nhiều khả năng gây ra lỗi. Ngoài ra, bạn sẽ cần xác minh rằng mã này được chạy trước bất kỳ đầu ra nào khác.

+0

Bạn cũng nên đặt Trạng thái HTTP thành 302. –

+7

"Trường hợp đặc biệt thứ hai là tiêu đề" Vị trí: ". Không chỉ gửi tiêu đề này trở lại trình duyệt mà còn trả về mã trạng thái REDIRECT (302) cho trình duyệt trừ khi mã trạng thái 201 hoặc mã 3xx đã được đặt. " – colithium

+2

Tôi bị làm phiền bởi "afterwords". –

-1

Chức năng header() thực hiện điều này:

 
header("Location: user.php"); 
+0

Vui lòng sử dụng URL tuyệt đối theo các đặc điểm kỹ thuật HTTP. – Gumbo

+0

Đúng, nhưng hãy chắc chắn rằng bạn loại bỏ tiếng vang đầu tiên hoặc bạn có thể trải nghiệm một "Tiêu đề allready gửi";) – fijter

0

Yes. Về bản chất, miễn là không có gì là đầu ra, bạn có thể làm bất cứ điều gì bạn muốn (giết phiên, xóa cookie của người dùng, tính số Pi thành chữ số 'n', v.v.) trước khi phát hành tiêu đề vị trí.

7
header("Location: http://www.domain.com/user.php"); 

Nhưng trước tiên bạn không thể tạo tiếng vang và sau đó chuyển hướng.

+0

xin vui lòng xem chỉnh sửa. – amit

44

Sử dụng javascript làm không an toàn sẽ đảm bảo người dùng được chuyển hướng (ngay cả khi tiêu đề đã được gửi). Ở đây bạn đi:

// $url should be an absolute url 
function redirect($url){ 
    if (headers_sent()){ 
     die('<script type="text/javascript">window.location=\''.$url.'\';</script‌​>'); 
    }else{ 
     header('Location: ' . $url); 
     die(); 
    }  
} 

Nếu bạn cần xử lý đúng đường dẫn tương đối, tôi đã viết hàm cho điều đó (nhưng nằm ngoài phạm vi của câu hỏi).

+1

điều này không thực sự hoạt động. – amit

+7

cách mô tả. – brianreavis

+7

Thay đổi dòng này và nó sẽ ... 'die ('');' – Gabe

0

Tôi có thể đặt thông báo dưới dạng biến phiên, chuyển hướng người dùng đến trang khác hiển thị thông báo và hủy phiên.

0

Chức năng header() trong PHP thực hiện điều này, nhưng đảm bảo rằng bạn gọi nó trước khi bất kỳ nội dung tệp nào khác được gửi tới trình duyệt nếu không bạn sẽ nhận được lỗi.

JavaScript là một thay thế nếu bạn đã gửi nội dung tệp.

8
$url='the/url/you/want/to/go'; 
    echo '<META HTTP-EQUIV=REFRESH CONTENT="1; '.$url.'">'; 

làm việc này đối với tôi tốt.

+1

điều này cũng phù hợp với tôi. Cảm ơn – Kyrie

+0

Đã làm việc cho tôi cũng như –

+0

Vâng, đây là cuộc sống tiết kiệm cho tôi; Tôi tự động điền vào các tiêu đề trang và id cơ thể từ một tiêu đề bao gồm vì vậy không có vấn đề gì, tôi đã luôn luôn có được gửi tiêu đề. Và đối với tôi, đây chỉ là một phản ứng bot dạng web. Tốt nhất, cảm ơn. – SteveCinq

0

thực sự, tôi đã tìm thấy điều này trong mã của một cm dựa trên php.

chuyển hướng ('? Module = blog', 0);

để có thể. Trong trường hợp này, bạn đã đăng nhập ở cấp quản trị, vì vậy không có hại không có lỗi (tôi giả sử). phần đầu tiên là url và thứ hai? Tôi không thể tìm thấy bất kỳ tài liệu nào về số nguyên, nhưng tôi đoán đó là thời gian hoặc dữ liệu vì nó được đính kèm vào biểu mẫu.

Tôi cũng muốn làm mới trang sau sự kiện và đặt vị trí này ở vị trí tốt hơn sẽ hoạt động tốt.

0

Bạn có thể sử dụng mã này để chuyển hướng trong php

<?php 
/* Redirect browser */ 
header("Location: http://example.com/"); 
/* Make sure that code below does not get executed when we redirect. */ 
exit; 
?> 
9

Cách đơn giản là sử dụng:

echo '<script>window.location.href = "the-target-page.php";</script>'; 
+0

điều này đã được đề cập trong câu trả lời khác. Mọi thứ mới để thêm vào chủ đề? –

3
<?php 

    http_redirect("relpath", array("name" => "value"), true, HTTP_REDIRECT_PERM); 

?> 
0

nếu bạn muốn bao gồm chuyển hướng trong file php của bạn mà không nhất thiết phải có ở trên cùng, bạn có thể kích hoạt bộ đệm đầu ra ở trên cùng, sau đó chuyển hướng cuộc gọi từ bất kỳ đâu trong trang. Thí dụ;

<?php 
ob_start(); //first line 
... do some work here 
... do some more 
header("Location: http://www.yourwebsite.com/user.php"); 
exit(); 
... do some work here 
... do some more 
0

Như metioned bởi nixxx thêm ob_start() trước khi thêm bất kỳ mã php sẽ ngăn chặn các tiêu đề đã gửi báo lỗi.

Nó hoạt động cho tôi

Mã bên dưới cũng hoạt động. Nhưng trước tiên nó tải trang và sau đó chuyển hướng khi tôi sử dụng nó.

echo '<META HTTP-EQUIV=REFRESH CONTENT="1; '.$redirect_url.'">'; 
Các vấn đề liên quan