Làm cách nào để thực hiện chuyển hướng trong PHP?


1262

Có thể chuyển hướng người dùng đến một trang khác thông qua việc sử dụng PHP không?

Giả sử người dùng truy cập www.example.com/page.phpvà tôi muốn chuyển hướng họ đến www.example.com/index.php, làm thế nào tôi có thể làm như vậy mà không cần sử dụng meta refresh? Có thể không?

Điều này thậm chí có thể bảo vệ các trang của tôi khỏi người dùng trái phép.


Bạn có thể cập nhật tiêu đề trong PHP: tiêu đề
Zack Marrapese

11
@Sam: giống như nút bên, không thực hiện bất kỳ loại protection from unauthorized userschuyển hướng nào; đây không phải là cách mọi thứ nên được thực hiện;)
Strae

7
@Strae Có gì sai khi bảo vệ các trang với chuyển hướng? Vậy thì cách tốt nhất là gì?

6
@PravindaAmarathunga redirect là một trong những yếu tố, nhưng không phải là yếu tố duy nhất. Chỉ cần chắc chắn rằng các yếu tố được bảo vệ hoàn toàn không xuất ra đối với người dùng trái phép; Chuyển hướng trình duyệt có thể bị vô hiệu hóa phía máy khách, ví dụ: nếu trình duyệt không thực hiện chuyển hướng và trang gốc được xuất ra như bình thường, người dùng sẽ thấy gì? CMS thường thực hiện chuyển hướng không in ra các mục được bảo vệ, thay thế đầu ra bình thường bằng một thông điệp lịch sự.
Strae

@PravindaAmarathunga kiểm tra liên kết từ câu trả lời của markus: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Strae

Câu trả lời:


1698

Tóm tắt các câu trả lời hiện có cộng với hai xu của riêng tôi:

1. Câu trả lời cơ bản

Bạn có thể sử dụng header()chức năng để gửi một tiêu đề HTTP mới, nhưng điều này phải được gửi đến trình duyệt trước bất kỳ HTML hoặc văn bản nào (vì vậy trước khi <!DOCTYPE ...>khai báo chẳng hạn).

header('Location: '.$newURL);

2. Chi tiết quan trọng

chết () hoặc thoát ()

header("Location: http://example.com/myOtherPage.php");
die();

Tại sao bạn nên sử dụng die()hoặc exit(): WTF hàng ngày

URL tuyệt đối hoặc tương đối

Kể từ tháng 6 năm 2014, cả URL tuyệt đối và tương đối đều có thể được sử dụng. Xem RFC 7231 đã thay thế RFC 2616 cũ , nơi chỉ cho phép các URL tuyệt đối.

Mã trạng thái

Trình hướng dẫn "Vị trí" của PHP vẫn sử dụng mã HTTP 302 -redirect, nhưng đây không phải là mã bạn nên sử dụng. Bạn nên xem xét 301 (chuyển hướng vĩnh viễn) hoặc 303 (khác).

Lưu ý: W3C đề cập rằng tiêu đề 303 không tương thích với "nhiều tác nhân người dùng tiền HTTP / 1.1. Các trình duyệt được sử dụng hiện tại đều là các tác nhân người dùng HTTP / 1.1. Điều này không đúng với nhiều tác nhân người dùng khác như nhện và rô bốt.

3. Tài liệu

Tiêu đề HTTP và header()chức năng trong PHP

4. Lựa chọn thay thế

Bạn có thể sử dụng phương pháp thay thế http_redirect($url);cần cài đặt gói PECL .

5. Chức năng trợ giúp

Chức năng này không kết hợp mã trạng thái 303:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://example.com/', false);

Điều này linh hoạt hơn:

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6. Cách giải quyết

Như đã đề cập header()chuyển hướng chỉ hoạt động trước khi bất cứ điều gì được viết ra. Chúng thường thất bại nếu được gọi trong đầu ra HTML . Sau đó, bạn có thể sử dụng một cách giải quyết tiêu đề HTML (không chuyên nghiệp lắm!) Như:

 <meta http-equiv="refresh" content="0;url=finalpage.html">

Hoặc chuyển hướng JavaScript thậm chí.

window.location.replace("http://example.com/");

5
Một số vấn đề với câu trả lời này: 303 có thể không phải là mã trạng thái "chính xác". 301 có thể được mong muốn cho Google, ví dụ. Thứ hai, header('Location: '.$newURL);phải trước khi bất kỳ HTML (hoặc văn bản) nào được chuyển đến trình duyệt, nếu không nó sẽ không hoạt động chính xác.
Chuck Le Mông

6
Câu chuyện WTF hàng ngày là một câu chuyện phổ biến, đáng buồn. Dù sao, đó không phải là cái chết mất tích gây ra vấn đề mà là một thiết kế tồi. Đóng quá trình một cách dữ dội là sai trong 99,9% các trường hợp. Một giải pháp phổ biến, sạch hơn (không phải là cách ưa thích của tôi) là ném RedirectionException và bắt nó vào điểm nhập ứng dụng của bạn. Sau đó, bạn có thể có tất cả các cuộc gọi "sau *" (nhật ký / kết nối chặt chẽ / mọi thứ)
robertodecurnex

4
Không http-equiv="Location"được hỗ trợ bởi tất cả các trình duyệt. Bạn nên sử dụng refreshthay thế! <meta http-equiv="refresh" content="0;url=http://example.com/">
Timo002

71
Không bao giờ phát hành 301 trừ khi bạn có ý đó . 301 có nghĩa là vĩnh viễn và vĩnh viễn có nghĩa là vĩnh viễn , có nghĩa là nó sẽ được lưu trữ bởi các tác nhân người dùng, nghĩa là những đêm dài chứa đầy caffeine nhìn chằm chằm vào nhật ký ứng dụng tự hỏi liệu bạn có bị điên không vì bạn nên gọi hoặc cập nhật một số trang và bạn thề với Chúa, nó hoạt động trên máy của bạn chứ không phải của khách hàng. Nếu bạn hoàn toàn phải gọi số 301, hãy đặt tuổi thọ tối đa kiểm soát bộ đệm trên tài nguyên. Bạn không có trí tuệ vô hạn và bạn không nên hành động như bạn.
madumlao

2
Nhưng có một lý do để sử dụng die over exit? lối ra có vẻ sạch sẽ và phù hợp hơn.
ars265

122

Sử dụng header()chức năng để gửi tiêu đề HTTPLocation :

header('Location: '.$newURL);

Trái với những gì một số người nghĩ, die()không liên quan gì đến chuyển hướng. Sử dụng nó chỉ nếu bạn muốn chuyển hướng , thay vì thực hiện bình thường.

Tệp example.php :

<?php
    header('Location: static.html');
    $fh = fopen('/tmp/track.txt', 'a');
    fwrite($fh, $_SERVER['REMOTE_ADDR'] . ' ' . date('c') . "\n");
    fclose($fh);
?>

Kết quả của ba vụ hành quyết:

bart@hal9k:~> cat /tmp/track.txt
127.0.0.1 2009-04-21T09:50:02+02:00
127.0.0.1 2009-04-21T09:50:05+02:00
127.0.0.1 2009-04-21T09:50:08+02:00

Tiếp tục - bắt buộc die()/ exit()là một số truyền thuyết đô thị không liên quan gì đến PHP thực tế. Nó không có gì để làm với khách hàng "tôn trọng" Location:tiêu đề. Gửi một tiêu đề không dừng thực thi PHP, bất kể máy khách được sử dụng.


8
die () hoặc exit () dành cho những khách hàng không tôn trọng tiêu đề "Vị trí: ..."
clawr

12
@clawr: Không, exit()là để ngăn trang hiển thị nội dung còn lại (nghĩ rằng các trang bị hạn chế). vartec đã đúng, nó không liên quan gì đến tiêu đề Vị trí HTTP và bạn không cần phải làm vậy exit. Tôi đã chọn đưa nó vào câu trả lời của mình bởi vì, đối với một người không biết cách thực hiện chuyển hướng đơn giản , người ta cũng có thể chơi an toàn thay vì không thực hiện một bước đơn giản nhưng quan trọng chỉ để anh ta có thể tận dụng quy trình nâng cao điều khiển.
Alix Axel

1
Nhưng các trình duyệt tôn trọng tiêu đề sẽ rời khỏi trang và đóng kết nối trong khi tập lệnh của bạn vẫn đang thực thi. Điều này là hoàn toàn xấu. PHP sẽ tiếp tục với tập lệnh một thời gian (đó là lý do tại sao mã của bạn thực thi) nhưng có thể hủy bỏ nó một cách ngẫu nhiên ở giữa thực thi, khiến công cụ bị hỏng. Gọi ign_user_abort () sẽ ngăn chặn điều này, nhưng thật lòng tôi không đáng. Chỉ cần tiếp tục với công cụ viết HTML của bạn (mặc dù có thể vô dụng) nhưng không thực hiện công cụ ghi trên đĩa hoặc cơ sở dữ liệu sau một tiêu đề ('Vị trí:'); Ghi vào đĩa trước khi chuyển hướng nếu có thể. [Ngoài ra: url phải tuyệt đối.]
FrancescoMM

Có cách nào để chuyển hướng trước khi trình duyệt phát hiện giao thức HTTP không? lý do tôi cần chuyển hướng là vì tôi không thể có đủ chứng chỉ SSL cho tất cả các tên miền của mình. Tôi sẽ sử dụng .htaccessđể chuyển hướng, nhưng tôi cần một cách nào đó để chuyển qua tên miền nào được chuyển hướng đến tên miền cuối cùng?
oldboy

109
function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
        header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

Redirect('http://www.google.com/', false);

Đừng quên chết () / exit ()!


6
Và đừng quên bộ đệm đầu ra hoặc bạn sẽ kết thúc với 'Tiêu đề đã được gửi'.
Kuroki Kaze

8
... và đừng quên in ra một ngày nào đó như "bạn sẽ được chuyển hướng đến $ nepage trong $ n giây, nhấp vào liên kết $ ở đây nếu chuyển hướng không xảy ra" Một số trình duyệt và một số cài đặt của trình duyệt, có thể không chuyển hướng đó.
Strae

3
@DaNieL: loại chuyển hướng này sẽ không mất "$ n giây". Sẽ ngay lập tức nếu nó xảy ra, và bất kỳ trình duyệt phù hợp nào cũng sẽ xử lý nó. Tôi nghĩ rằng bạn đang nghĩ về các chuyển hướng "meta refresh" mà mọi người sử dụng khi họ không biết gì hơn.
rmeador

1
@rmeador ... Dành cho các trình duyệt cũ hơn và các trình duyệt đặc biệt. Trước tiên, bạn nên thực hiện tiêu đề Vị trí của mình, nếu không có chuyển hướng meta với "bạn sẽ được chuyển hướng đến trang trong x giây" với một liên kết trong trường hợp chuyển hướng meta không thành công. Đó là cách thích hợp và không an toàn để thực hiện chuyển hướng.
Andrew Moore

3
Andrew: làm thế nào trình duyệt HTTP không tôn trọng Địa điểm :?
vartec

102

Xuất JavaScript từ PHP bằng cách sử dụng echo, sẽ thực hiện công việc.

echo '<script type="text/javascript">
           window.location = "http://www.google.com/"
      </script>';

Bạn thực sự không thể làm điều đó trong PHP trừ khi bạn đệm đầu ra trang và sau đó kiểm tra điều kiện chuyển hướng. Đó có thể là quá nhiều rắc rối. Hãy nhớ rằng các tiêu đề là điều đầu tiên được gửi từ trang. Hầu hết các chuyển hướng thường được yêu cầu sau này trong trang. Cho rằng bạn phải đệm tất cả đầu ra của trang và kiểm tra điều kiện chuyển hướng sau này. Tại thời điểm đó, bạn có thể chuyển hướng tiêu đề người dùng trang () hoặc chỉ đơn giản lặp lại đầu ra được đệm.

Để biết thêm về bộ đệm (lợi thế)

Bộ đệm đầu ra là gì?


2
Đơn giản và để trả lời điểm! Tuyệt vời cho một chuyển hướng trang đơn giản!
Stathis Andronikos

Và theo cách đó bạn không gặp phải Cannot modify header information - headers already sent bylỗi phổ biến .
Kai Noack

1
@hmd, nếu javascript bị vô hiệu hóa thì sao?
Istiaque Ahmed

Javascript @IstiaqueAhmed hầu như luôn được kích hoạt những ngày này nhưng nếu nó bị vô hiệu hóa thì bạn có thể sử dụng bộ đệm PHP. Câu hỏi SO này trả lời rằng. Nếu bạn đang sử dụng bộ đệm PHP thì bạn không cần phương pháp này.
Hammad Khan

Sai, bạn có thể (và nên) làm điều đó trong PHP ngay cả khi không có bộ đệm: trong một trang được thiết kế tốt, tất cả quá trình xử lý PHP có liên quan sẽ diễn ra trước khi bất kỳ nội dung HTML nào được gửi đến người dùng. Bằng cách đó, các chuyển hướng PHP sẽ hoạt động tốt.
MestreLion

91

1. Sử dụng chức năng tiêu đề với exit()

<?php 
     header('Location: target-page.php');
     exit();
?>

nhưng nếu bạn sử dụng chức năng tiêu đề thì đôi khi bạn sẽ nhận được "cảnh báo như tiêu đề đã gửi" để giải quyết việc không lặp lại hoặc in trước khi gửi tiêu đề hoặc bạn chỉ có thể sử dụng die()hoặc exit()sau chức năng tiêu đề.

2. Không có tiêu đề

<?php 
    echo "<script>location.href='target-page.php';</script>";
?>

ở đây bạn sẽ không phải đối mặt với bất kỳ vấn đề

3. Sử dụng chức năng tiêu đề với ob_start()ob_end_flush()

<?php
ob_start(); //this should be first line of your page
header('Location: target-page.php');
ob_end_flush(); //this should be last line of your page
?>

Làm việc như một cơ duyên. Tôi sử dụng <? Php echo "<script> location.href = ' google.fr /'; </script >"; ?> Để kiểm tra nó, và nó đã làm những gì tôi muốn
DoctorDroid Haiti

1
Giải pháp thứ hai sẽ không hoạt động với JS bị vô hiệu hóa.
Tajni

55

Hầu hết các câu trả lời này đang quên một bước rất quan trọng!

header("Location: myOtherPage.php");
die();

Rời khỏi dòng thứ hai quan trọng đó có thể thấy bạn kết thúc trên Daily WTF . Vấn đề là các trình duyệt không phải tôn trọng các tiêu đề mà trang của bạn trả về, do đó, với các tiêu đề bị bỏ qua, phần còn lại của trang sẽ được thực thi mà không cần chuyển hướng.


1
Điều gì về cung cấp một số đầu ra cho người dùng trước khi giết tập lệnh? Bạn biết đấy, mọi người thích biết chuyện gì đang xảy ra ...
Strae

3
bạn đang giả định rằng tập lệnh không có gì để làm ngoại trừ chuyển hướng. Mà có thể không đúng chút nào.
vartec

13
@DaNieL: thay đổi nó thành chết ("Ngừng bỏ qua các tiêu đề của tôi!")
nickf

3
Tôi thích lời giải thích đơn giản die();mà bạn đã đưa ra - nếu bạn không làm điều đó, người dùng có thể thấy trang hoàn chỉnh trong giây lát nếu bạn sử dụng nó; người dùng sẽ được chuyển hướng và không có trục trặc nội dung tạm thời nào hiển thị + 1
TheBlackBenzKid

Có thể có hoạt động hữu ích xảy ra sau khi tiêu đề được gửi, hoạt động không gửi gì đến trình duyệt, nhưng ghi nhật ký hoạt động hoặc kết thúc ghi lại các giao dịch. Vì lý do này, nhu cầu chết / thoát phụ thuộc vào kịch bản.
Dan ALLen

28

Sử dụng:

<?php header('Location: another-php-file.php'); exit(); ?>

Hoặc nếu bạn đã mở thẻ PHP, hãy sử dụng:

header('Location: another-php-file.php'); exit();

Bạn cũng có thể chuyển hướng đến các trang bên ngoài, ví dụ:

header('Location: https://www.google.com'); exit();

Hãy chắc chắn rằng bạn bao gồm exit()hoặc bao gồm die().


25

Bạn có thể sử dụng các biến phiên để kiểm soát quyền truy cập vào các trang và cũng cho phép người dùng hợp lệ:

<?php
    session_start();

    if (!isset( $_SESSION["valid_user"]))
    {
        header("location:../");
        exit();
    }

    // Page goes here
?>

http://php.net/manual/en/reserved.variabled.session.php .

Gần đây, tôi đã bị tấn công mạng và quyết định, tôi cần biết người dùng đang cố truy cập Bảng quản trị hoặc phần dành riêng của Ứng dụng web.

Vì vậy, tôi đã thêm quyền truy cập nhật ký cho địa chỉ IP và phiên người dùng trong tệp văn bản, vì tôi không muốn làm phiền cơ sở dữ liệu của mình.


19

Nhiều câu trả lời trong số này là đúng, nhưng họ cho rằng bạn có một URL tuyệt đối, có thể không phải là trường hợp. Nếu bạn muốn sử dụng một URL tương đối và tạo phần còn lại, thì bạn có thể làm một cái gì đó như thế này ...

$url = 'http://' . $_SERVER['HTTP_HOST'];            // Get the server
$url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); // Get the current directory
$url .= '/your-relative/path-goes/here/';            // <-- Your relative path
header('Location: ' . $url, true, 302);              // Use either 301 or 302

16

header( 'Location: http://www.yoursite.com/new_page.html' );


Có cách nào để chuyển hướng trước khi trình duyệt phát hiện giao thức HTTP không? lý do tôi cần chuyển hướng là vì tôi không thể có đủ chứng chỉ SSL cho tất cả các tên miền của mình. Tôi sẽ sử dụng .htaccessđể chuyển hướng, nhưng tôi cần một cách nào đó để chuyển qua tên miền nào được chuyển hướng đến tên miền cuối cùng?
oldboy

16

Sử dụng mã sau đây:

header("Location: /index.php");
exit(0);   

14

Tôi đã trả lời câu hỏi này, nhưng tôi sẽ làm lại vì trong khi đó tôi đã biết rằng có những trường hợp đặc biệt nếu bạn đang chạy trong CLI (chuyển hướng không thể xảy ra và do đó không nên exit()) hoặc nếu máy chủ web của bạn là chạy PHP dưới dạng CGI (F) (nó cần một Statustiêu đề được đặt trước đó để chuyển hướng chính xác).

function Redirect($url, $code = 302)
{
    if (strncmp('cli', PHP_SAPI, 3) !== 0)
    {
        if (headers_sent() !== true)
        {
            if (strlen(session_id()) > 0) // If using sessions
            {
                session_regenerate_id(true); // Avoids session fixation attacks
                session_write_close(); // Avoids having sessions lock other requests
            }

            if (strncmp('cgi', PHP_SAPI, 3) === 0)
            {
                header(sprintf('Status: %03u', $code), true, $code);
            }

            header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302);
        }

        exit();
    }
}

Tôi cũng xử lý vấn đề này hỗ trợ các mã HTTP chuyển hướng khác nhau ( 301, 302, 303307), vì nó đã được đề cập trong các ý kiến của câu trả lời trước đây của tôi. Dưới đây là các mô tả:

  • 301 - Đã di chuyển vĩnh viễn
  • 302 - Đã tìm thấy
  • 303 - Xem khác
  • 307 - Chuyển hướng tạm thời (HTTP / 1.1)

11

Để chuyển hướng khách truy cập đến một trang khác (đặc biệt hữu ích trong vòng lặp có điều kiện), chỉ cần sử dụng mã sau đây:

<?php
    header('Location: mypage.php');
?>

Trong trường hợp này, mypage.phplà địa chỉ của trang mà bạn muốn chuyển hướng khách truy cập. Địa chỉ này có thể là tuyệt đối và cũng có thể bao gồm các tham số trong định dạng này:mypage.php?param1=val1&m2=val2)

Con đường tương đối / tuyệt đối

Khi xử lý các đường dẫn tương đối hoặc tuyệt đối, lý tưởng là chọn một đường dẫn tuyệt đối từ thư mục gốc của máy chủ (DOCUMENT_ROOT). Sử dụng định dạng sau:

<?php
    header('Location: /directory/mypage.php');
?>

Nếu bao giờ trang đích nằm trên một máy chủ khác, bạn sẽ bao gồm URL đầy đủ:

<?php
    header('Location: http://www.ccm.net/forum/');
?>

Tiêu đề HTTP

Theo giao thức HTTP, các tiêu đề HTTP phải được gửi before bất kỳ loại nội dung nào. Điều này có nghĩa là không có ký tự nào được gửi trước tiêu đề - thậm chí không phải là một khoảng trống!

Chuyển hướng tạm thời / vĩnh viễn

Theo mặc định, loại chuyển hướng được trình bày ở trên là tạm thời. Điều này có nghĩa là các công cụ tìm kiếm, như Google Tìm kiếm, sẽ không tính đến việc chuyển hướng khi lập chỉ mục.

Nếu bạn muốn thông báo cho các công cụ tìm kiếm rằng một trang đã được di chuyển vĩnh viễn đến một vị trí khác, hãy sử dụng mã sau đây:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: new_address');
?>

Ví dụ: trang này có mã sau:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: /pc/imprimante.php3');
    exit();
?>

Khi bạn nhấp vào liên kết ở trên, bạn sẽ tự động được chuyển hướng đến trang này. Hơn nữa, nó là một chuyển hướng vĩnh viễn (Trạng thái: 301 Đã di chuyển vĩnh viễn). Vì vậy, nếu bạn nhập URL đầu tiên vào Google, bạn sẽ tự động được chuyển hướng đến liên kết được chuyển hướng thứ hai.

Giải thích mã PHP

Mã PHP nằm sau tiêu đề () sẽ được máy chủ giải thích, ngay cả khi khách truy cập di chuyển đến địa chỉ được chỉ định trong chuyển hướng. Trong hầu hết các trường hợp, điều này có nghĩa là bạn cần một phương thức để theo header()chức năng của exit()hàm để giảm tải của máy chủ:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>

Tại sao (gần cuối đoạn thứ hai)? Bạn có nghĩa là &parathay vào đó (vì vậy toàn bộ đọc mypage.php?param1=val1&param2=val2))? (Các thực thể HTML para ) là "¶" - có lẽ một số chương trình bên ngoài thực hiện chuyển đổi)?.
Peter Mortensen

9

Sử dụng:

<?php
    header('Location: redirectpage.php');
    header('Location: redirectpage.php');
    exit();
    echo "<script>location.href='redirectpage.php';</script>";
?>

Đây là một chuyển hướng PHP thông thường và bình thường, nhưng bạn có thể tạo một trang chuyển hướng với một vài giây chờ đợi bằng đoạn mã dưới đây:

<?php
    header('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.
?>

7

Trước thềm web ngữ nghĩa, tính chính xác là điều cần xem xét. Thật không may, tiêu đề "Vị trí" của PHP vẫn sử dụng mã chuyển hướng HTTP 302 , trong đó, hoàn toàn không phải là mã tốt nhất để chuyển hướng. Cái mà nó nên sử dụng thay thế, là cái thứ 303 .

W3C đủ tốt để đề cập rằng tiêu đề 303 không tương thích với "nhiều tác nhân người dùng tiền HTTP / 1.1", điều này sẽ không có trình duyệt sử dụng hiện tại. Vì vậy, 302 là một di tích, không nên sử dụng.

... Hoặc bạn có thể bỏ qua nó, như mọi người khác ...


7

Bạn có thể sử dụng một số phương thức JavaScript như bên dưới

  1. self.location="http://www.example.com/index.php";

  2. window.location.href="http://www.example.com/index.php";

  3. document.location.href = 'http://www.example.com/index.php';

  4. window.location.replace("http://www.example.com/index.php");


Javascript chạy trên máy khách có thể hoặc không phải là thứ bạn đang tìm kiếm.
chharvey

7

Có, bạn có thể sử dụng hàm header () ,

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

Và cách tốt nhất là gọi hàm exit () ngay sauheader() hàm để tránh thực thi mã dưới đây.

Theo tài liệu, header()phải được gọi trước khi bất kỳ đầu ra thực tế nào được gửi.


6

Giống như những người khác ở đây đã nói, gửi tiêu đề vị trí với:

header( "Location: http://www.mywebsite.com/otherpage.php" );

nhưng bạn cần phải làm điều đó trước khi bạn gửi bất kỳ đầu ra nào khác tới trình duyệt.

Ngoài ra, nếu bạn sẽ sử dụng điều này để chặn người dùng chưa được xác thực từ một số trang nhất định, như bạn đã đề cập, hãy nhớ rằng một số tác nhân người dùng sẽ bỏ qua điều này và tiếp tục trên trang hiện tại, vì vậy bạn sẽ cần phải chết ( ) sau khi bạn gửi nó.


but you need to do it before you've sent any other output to the browser. Tuyệt vời!! Đã tìm kiếm trong vài phút về lý do tại sao tôi tiếp tục nhận được các tiêu đề đã gửi lỗi. +1 !!
Josh

Tổng quát hơn, bạn có / dừng hoàn toàn tập lệnh của bạn /. die()chỉ là một cách để làm điều đó.
MauganRa

6

Đây là suy nghĩ của tôi:

IMHO, cách tốt nhất để chuyển hướng một yêu cầu đến sẽ là sử dụng các tiêu đề vị trí, đi

<?php
    header("Location: /index.php");
?>

Khi câu lệnh này được thực thi và đầu ra được gửi đi, trình duyệt sẽ bắt đầu điều hướng lại người dùng. Tuy nhiên, đảm bảo rằng không có bất kỳ đầu ra nào (bất kỳ echo / var_dump) nào trước khi gửi các tiêu đề, nếu không nó sẽ dẫn đến lỗi.

Mặc dù đây là một cách nhanh chóng và bẩn thỉu để đạt được những gì được yêu cầu ban đầu, nhưng cuối cùng nó sẽ trở thành một thảm họa SEO, vì loại chuyển hướng này luôn được hiểu là chuyển hướng 301/302, do đó các công cụ tìm kiếm sẽ luôn thấy trang chỉ mục dưới dạng trang được định hướng lại và không phải là trang của trang đích / trang chính.

Do đó nó sẽ ảnh hưởng đến cài đặt SEO của trang web.


1
exit () nên được sử dụng ngay sau tiêu đề ()
EKanadily 17/2/2017

@docesam .. đã đồng ý .. exit () sẽ được gọi ngay sau cuộc gọi tiêu đề (). Tuy nhiên tôi cảm thấy, nếu không còn đầu ra cho trình duyệt sau câu lệnh tiêu đề () này, thì có thể không cần thoát - chỉ là ý kiến ​​của tôi
Bhaskar Pramanik

có nhưng bạn phải giải thích rằng bởi vì ai đó có thể sao chép dòng mã của bạn vào tập lệnh của anh ta và điều đó có khả năng gây ra thời gian dài xoay quanh anh ta để tìm ra điều gì sai.
EKanadily

1
@BhaskarPramanik tưởng tượng bạn phải khóa cửa nhanh chóng, nhưng sau đó bạn phải kéo / đẩy / đập chúng một lần nữa để chắc chắn rằng nó đã bị khóa hay chưa ..
vào

5

Cách tốt nhất để chuyển hướng với PHP là đoạn mã sau ...

 header("Location: /index.php");

Hãy chắc chắn rằng không có mã nào hoạt động sau

header("Location: /index.php");

Tất cả các mã phải được thực hiện trước dòng trên.

Giả sử,

Trường hợp 1:

echo "I am a web developer";
header("Location: /index.php");

Nó sẽ chuyển hướng đúng đến vị trí (index.php).

Trường hợp 2:

return $something;
header("Location: /index.php");

Đoạn mã trên sẽ không chuyển hướng đến vị trí (index.php).


Đã có một câu trả lời có 1085 chứa thông tin bạn cung cấp, và nhiều hơn nữa.
Patrick Hund

5

Vâng, có thể sử dụng PHP. Chúng tôi sẽ chuyển hướng đến một trang khác.

Hãy thử mã sau:

<?php
    header("Location:./"); // Redirect to index file
    header("Location:index.php"); // Redirect to index file
    header("Location:example.php");
?>

4

1. Sử dụng header , một hàm PHP tích hợp

a) Chuyển hướng đơn giản không có tham số

<?php
   header('Location: index.php');
?>

b) Chuyển hướng với các tham số GET

<?php
      $id = 2;
      header("Location: index.php?id=$id&msg=succesfully redirect");
  ?>

2. Chuyển hướng với JavaScript trong PHP

a) Chuyển hướng đơn giản không có tham số

<?php
     echo "<script>location.href='index.php';</script>";
 ?>

b) Chuyển hướng với các tham số GET

<?php
     $id = 2;
     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
   ?>

Bit javascript bằng cách nào đó là điều duy nhất đang hoạt động trong lưu trữ cuối cùng của trang web; Tôi tin rằng đó là vấn đề của bộ nhớ đệm nhưng với điều đó tôi đã giải quyết nó ngay lập tức.
cdsaenz

3

Chúng tôi có thể làm điều đó theo hai cách:

  1. Khi người dùng truy cập https://bskud.com/PINCODE/BIHAR/index.php, sau đó chuyển hướng đến https://bskud.com/PINCODE/BIHAR.php

    Bằng mã PHP dưới đây

    <?php
        header("Location: https://bskud.com/PINCODE/BIHAR.php");
        exit;
    ?>

    Lưu mã trên trong https://bskud.com/PINCODE/BIHAR/index.php

  2. Khi bất kỳ điều kiện nào là đúng thì chuyển hướng đến một trang khác:

    <?php
        $myVar = "bskud";
        if ($myVar == "bskud") {
    ?>
    
    <script> window.location.href="https://bskud.com";  </script>
    
    <?php
        }
        else {
            echo "<b>Check the website name again</b>";
        }
    ?>

Cái này là cái gì? Vui lòng không sử dụng các liên kết đến trang web của riêng bạn. Và ví dụ thứ hai sử dụng chuyển hướng javascript chứ không phải header()chức năng PHP .
Kịch bản

2

Sử dụng:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>

1
Bạn có thể giải thích chức năng của mã của bạn? Câu trả lời của bạn đã được gắn cờ vì độ dài và nội dung của nó.
www139

2

Có nhiều cách để làm điều này, nhưng nếu bạn thích php, tôi khuyên bạn nên sử dụng header()chức năng này.

Về cơ bản

$your_target_url = www.example.com/index.php”;
header(“Location : $your_target_url”);
exit();

Nếu bạn muốn nâng nó lên một mức, tốt nhất là sử dụng nó trong các chức năng. Bằng cách đó, bạn có thể thêm xác thực và các phần tử kiểm tra khác trong đó.

Hãy thử bằng cách kiểm tra cấp độ của người dùng.

Vì vậy, giả sử bạn đã lưu trữ cấp thẩm quyền của người dùng trong phiên gọi là u_auth .

bên trong function.php

<?php
    function authRedirect($get_auth_level,
                          $required_level,
                          $if_fail_link = www.example.com/index.php”){
        if ($get_auth_level != $required_level){
            header(location : $if_fail_link);
            return false;
            exit();
        }
        else{
            return true;
        }
     }

     . . .

Sau đó, bạn sẽ gọi chức năng cho mọi trang mà bạn muốn xác thực.

Giống như trong page.phphoặc bất kỳ trang nào khác.

<?php

    // page.php

    require function.php

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 5
    authRedirect($_SESSION[‘u_auth’], 5);

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 4
    authRedirect($_SESSION[‘u_auth’], 4);

    // Redirects to www.someotherplace.com/somepage.php if the
    // user isn’t authentication level 2
    authRedirect($_SESSION[‘u_auth’], 2, www.someotherplace.com/somepage.php”);

    . . .

Người giới thiệu;


2

Tôi thích loại chuyển hướng theo thời gian.

<?php

header("Refresh: 5;url=índex.php");

2

Sử dụng chức năng tiêu đề để định tuyến

<?php
     header('Location: B.php');
     exit();
?>

Giả sử chúng ta muốn đường từ A.php tập tin để B.php hơn chúng ta phải có sự giúp đỡ của <button>hay <a>. Hãy xem một ví dụ

<?php
if(isset($_GET['go_to_page_b'])) {
    header('Location: B.php');
    exit();

}
?>

<p>I am page A</p>
<button name='go_to_page_b'>Page B</button>

B.php

<p> I am Page B</p>

Bạn có thể cung cấp giải pháp chính xác hay tốt?
Mehedi Abdullah

Đã có rất nhiều giải pháp. Giải pháp của bạn có hỗn hợp HTML và PHP mà không có thẻ PHP. Thứ hai, bạn gửi tiêu đề sau khi in mã html, vì vậy nó sẽ không hoạt động. Và tên của các tập tin ví dụ là xấu. Bạn không nên đặt tên chúng là A.php và B.php. Tôi biết đó chỉ là ví dụ, nhưng bạn vẫn nên quan tâm đến quy ước đặt tên.
Tajni

1

Nếu bạn đang chạy trên Apache, bạn cũng có thể sử dụng .htaccess để chuyển hướng.

Redirect 301 / http://new-site.com/

1

Bạn có thể cố gắng sử dụng headerchức năng PHP để thực hiện chuyển hướng. Bạn sẽ muốn đặt bộ đệm đầu ra để trình duyệt của bạn không đưa ra cảnh báo chuyển hướng đến màn hình.

ob_start();
header("Location: " . $website);
ob_end_flush();

1
exit () nên được sử dụng ngay sau tiêu đề (). Ngoài ra, bộ đệm đã được tự động bật theo mặc định trong một thời gian.
EKanadily

0

thử cái này

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.