ฉันจะเปลี่ยนเส้นทางใน PHP ได้อย่างไร


1262

เป็นไปได้ไหมที่จะเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่นผ่านการใช้ PHP?

บอกว่าผู้ใช้ไปที่www.example.com/page.phpและฉันต้องการที่จะเปลี่ยนเส้นทางพวกเขาwww.example.com/index.phpฉันจะทำเช่นนั้นโดยไม่ต้องใช้การรีเฟรชเมตา? เป็นไปได้ไหม?

สิ่งนี้สามารถป้องกันหน้าของฉันจากผู้ใช้ที่ไม่ได้รับอนุญาต


คุณสามารถอัปเดตส่วนหัวใน PHP: header
Zack Marrapese

11
@ Sam: เช่นเดียวกับโหนดด้านข้างอย่าใช้งานการprotection from unauthorized usersเปลี่ยนเส้นทางใด ๆ นี่ไม่ใช่สิ่งที่ควรทำ;)
Strae

7
@Strae มีอะไรผิดปกติกับการปกป้องหน้าเว็บด้วยการเปลี่ยนเส้นทาง? แล้ววิธีที่ดีที่สุดคืออะไร

6
@PravindaAmarathunga redirect เป็นหนึ่งในองค์ประกอบ แต่ไม่ใช่องค์ประกอบเดียว เพียง แต่ต้องแน่ใจว่าองค์ประกอบที่ได้รับการป้องกันนั้นไม่ได้รับผลกระทบใด ๆ เลย การเปลี่ยนเส้นทางของเบราว์เซอร์สามารถปิดการใช้งานฝั่งไคลเอ็นต์ตัวอย่างเช่น: หากเบราว์เซอร์ไม่ทำการเปลี่ยนเส้นทางและหน้าดั้งเดิมได้รับผลลัพธ์ตามปกติผู้ใช้จะเห็นอะไร CMS มักจะทำการเปลี่ยนเส้นทางและไม่พิมพ์รายการที่ได้รับการป้องกันแทนที่ผลลัพธ์ปกติด้วยข้อความที่สุภาพ
Strae

@PravindaAmarathunga ตรวจสอบลิงก์จากคำตอบของ markus: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Strae

คำตอบ:


1697

สรุปคำตอบที่มีอยู่รวมทั้งเซ็นต์สองของฉันเอง:

1. คำตอบพื้นฐาน

คุณสามารถใช้header()ฟังก์ชั่นเพื่อส่งส่วนหัว HTTP ใหม่ แต่สิ่งนี้จะต้องส่งไปยังเบราว์เซอร์ก่อน HTML หรือข้อความใด ๆ (เช่นก่อนการ<!DOCTYPE ...>ประกาศเป็นต้น)

header('Location: '.$newURL);

2. รายละเอียดที่สำคัญ

ตาย ()หรือออก ()

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

ทำไมคุณควรใช้die()หรือexit(): The WTF รายวัน

URL แบบสัมบูรณ์หรือแบบสัมพัทธ์

ตั้งแต่มิถุนายน 2014 คุณสามารถใช้ทั้ง URL แบบสัมบูรณ์และแบบย่อได้ ดูRFC 7231ซึ่งแทนที่RFC 2616เก่าซึ่งอนุญาตให้ใช้ URL แบบสัมบูรณ์เท่านั้น

รหัสสถานะ

"ตำแหน่ง" ของ PHP - ส่วนหัวยังคงใช้รหัสHTTP 302 -redirect แต่นี่ไม่ใช่สิ่งที่คุณควรใช้ คุณควรพิจารณา301 (การเปลี่ยนเส้นทางถาวร) หรือ303 (อื่น ๆ )

หมายเหตุ: W3C ระบุว่าส่วนหัว 303 ไม่เข้ากันกับ "ตัวแทนผู้ใช้ pre-HTTP / 1.1 จำนวนมากปัจจุบันเบราว์เซอร์ที่ใช้เป็นตัวแทนผู้ใช้ HTTP / 1.1 ทั้งหมดนี่ไม่เป็นความจริงสำหรับเอเจนต์ผู้ใช้อื่น ๆ เช่นแมงมุมและหุ่นยนต์

3. เอกสารประกอบ

ส่วนหัว HTTP และheader()ฟังก์ชั่นใน PHP

4. ทางเลือก

คุณอาจใช้วิธีอื่นhttp_redirect($url);ที่ต้องการติดตั้งPECL แพ็กเกจ PECL

5. ฟังก์ชั่นตัวช่วย

ฟังก์ชั่นนี้ไม่ได้รวมรหัสสถานะ 303:

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

    exit();
}

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

นี่คือความยืดหยุ่นมากขึ้น:

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

6. วิธีแก้ปัญหา

การheader()เปลี่ยนเส้นทางดังกล่าวทำงานก่อนที่จะมีการเขียนออกมา พวกเขามักจะล้มเหลวหากเรียกใช้เอาต์พุตHTML แบบ inmid จากนั้นคุณอาจใช้วิธีแก้ปัญหาส่วนหัว HTML (ไม่ใช่มืออาชีพมาก!) เช่น:

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

หรือแม้แต่การเปลี่ยนเส้นทางของ JavaScript

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

5
ปัญหาบางอย่างกับคำตอบนี้: 303 อาจไม่ใช่รหัสสถานะ "ถูกต้อง" ยกตัวอย่างเช่น Google อาจต้องการ 301 ประการที่สองheader('Location: '.$newURL);ต้องอยู่ก่อน HTML (หรือข้อความ) ใด ๆ ที่ถูกส่งผ่านไปยังเบราว์เซอร์ไม่เช่นนั้นจะทำงานไม่ถูกต้อง
Chuck Le Butt

6
เรื่องราว WTF รายวันเป็นเรื่องธรรมดาที่น่าเศร้า อย่างไรก็ตามมันไม่ได้หายไปตายสิ่งที่ทำให้เกิดปัญหา แต่การออกแบบที่ไม่ดี การปิดกระบวนการอย่างรุนแรงนั้นผิดใน 99.9% ของคดีทั้งหมด วิธีแก้ปัญหาทั่วไปที่สะอาดกว่า (ไม่ใช่สิ่งที่ฉันชื่นชอบ) คือการทิ้ง RedirectionException และจับมันไว้ที่จุดเข้าใช้งานของคุณ หลังจากนั้นคุณสามารถรับสาย "after *" ทั้งหมด (บันทึกการเชื่อมต่อ / ปิดการเชื่อมต่อ / อะไรก็ตาม)
robertodecurnex

4
http-equiv="Location"ไม่สนับสนุนเบราว์เซอร์ คุณควรใช้refreshแทน! <meta http-equiv="refresh" content="0;url=http://example.com/">
Timo002

71
ไม่เคยออก 301 เว้นแต่คุณหมายความว่ามัน 301 หมายถึงถาวรและถาวรหมายถึงถาวรหมายความว่ามันจะถูกเก็บไว้โดยตัวแทนผู้ใช้หมายถึงคืนเต็มไปด้วยคาเฟอีนจ้องมองที่บันทึกการใช้งานแอปพลิเคชันสงสัยว่าคุณจะบ้าเพราะคุณสาบานบางหน้าควรจะเรียกหรือปรับปรุงและสาบาน เพื่อพระเจ้ามันทำงานบนเครื่องของคุณ แต่ไม่ใช่ของลูกค้า หากคุณต้องโทรหา 301 ให้กำหนดอายุการใช้งานสูงสุดของการควบคุมแคช คุณไม่มีภูมิปัญญาที่ไม่มีที่สิ้นสุดและคุณไม่ควรทำตัวเหมือนที่คุณทำ
madumlao

2
แต่มีเหตุผลที่จะใช้ die over exit หรือไม่? ทางออกดูเหมือนสะอาดและเหมาะสมกว่า
ars265

122

ใช้header()ฟังก์ชั่นเพื่อส่งส่วนหัวHTTPLocation :

header('Location: '.$newURL);

ตรงกันข้ามกับสิ่งที่บางคนคิดว่าdie()ไม่มีส่วนเกี่ยวข้องกับการเปลี่ยนเส้นทาง ใช้เฉพาะเมื่อคุณต้องการเปลี่ยนเส้นทางแทนที่จะใช้การทำงานปกติ

ไฟล์example.php :

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

ผลการประหารชีวิตสามครั้ง:

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

ดำเนินการต่อ - บังคับdie()/ exit()เป็นตำนานในเมืองที่ไม่เกี่ยวข้องกับ PHP จริง มันไม่มีส่วนเกี่ยวข้องกับลูกค้า "เคารพ" Location:ส่วนหัว การส่งส่วนหัวไม่ได้หยุดการทำงานของ PHP ไม่ว่าลูกค้าจะใช้งานแบบใดก็ตาม


8
ตาย () หรือออก () สำหรับลูกค้าที่ไม่เคารพว่า "สถานที่ตั้ง: ..." หัว
clawr

12
@clawr: ไม่exit()เป็นการป้องกันไม่ให้หน้าแสดงเนื้อหาที่เหลืออยู่ (คิดว่าหน้า จำกัด ) vartec ที่ถูกต้องมันมีอะไรจะทำอย่างไรกับส่วนหัวของ HTTP ที่ตั้งexitและคุณไม่จำเป็นต้อง ฉันเลือกที่จะรวมไว้ในคำตอบของฉันเพราะสำหรับคนที่ไม่ทราบวิธีการเปลี่ยนเส้นทางแบบง่าย ๆคนหนึ่งอาจเล่นอย่างปลอดภัยมากกว่าที่จะไม่ใช้ขั้นตอนที่เรียบง่าย แต่สำคัญดังนั้นเขาจึงสามารถใช้ประโยชน์จากกระบวนการขั้นสูงควบคุม.
Alix Axel

1
แต่เบราว์เซอร์ที่เคารพส่วนหัวจะออกจากหน้าและปิดการเชื่อมต่อในขณะที่สคริปต์ของคุณยังคงดำเนินการอยู่ นี่มันแย่มาก PHP จะใช้สคริปต์ต่อไป (นั่นคือสาเหตุที่โค้ดของคุณรัน) แต่อาจยกเลิกแบบสุ่มในระหว่างการดำเนินการ การเรียก Ign_user_abort () จะป้องกันสิ่งนี้ แต่ขอแสดงความนับถือฉันไม่คุ้มค่า เพียงไปกับสิ่งที่เขียน HTML ของคุณ (แต่อาจไร้ประโยชน์) แต่อย่าทำสิ่งที่เขียนบนดิสก์หรือฐานข้อมูลหลังจากส่วนหัว ('ที่ตั้ง:'); เขียนลงดิสก์ก่อนเปลี่ยนเส้นทางถ้าเป็นไปได้ [นอกจากนี้: url ควรเป็นแบบสัมบูรณ์]
FrancescoMM

มีวิธีใดที่จะเปลี่ยนเส้นทางก่อนที่เบราว์เซอร์ตรวจพบโปรโตคอล HTTP? เหตุผลที่ฉันต้องเปลี่ยนเส้นทางคือเพราะฉันไม่สามารถรับใบรับรอง SSL เพียงพอสำหรับโดเมนทั้งหมดของฉัน ฉันจะใช้.htaccessเพื่อเปลี่ยนเส้นทาง แต่ฉันต้องการวิธีส่งผ่านโดเมนใดที่เปลี่ยนเส้นทางไปยังโดเมนสุดท้าย
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);

อย่าลืมตาย () / ออก ()!


6
และอย่าลืมบัฟเฟอร์ผลลัพธ์ไม่เช่นนั้นคุณจะจบลงด้วย 'ส่วนหัวที่ส่งไปแล้ว'
Kuroki Kaze

8
... และอย่าลืมพิมพ์ออกมาเหมือนกันเช่น "คุณจะถูกเปลี่ยนเส้นทางไปที่ $ nepage ใน $ n วินาทีคลิก $ link ที่นี่หากการเปลี่ยนเส้นทางไม่เกิดขึ้น" broser บางคนและการตั้งค่าบางอย่างของเบราว์เซอร์อาจล้มเหลวในการเปลี่ยนเส้นทาง
20169 Strae

3
@DaNieL: การเปลี่ยนเส้นทางประเภทนี้จะไม่ใช้ "$ n วินาที" มันจะเกิดขึ้นทันทีถ้ามันเกิดขึ้นเลยและเบราว์เซอร์ที่สอดคล้องกันใด ๆ ควรจัดการกับมัน ฉันคิดว่าคุณกำลังคิดถึงการเปลี่ยนเส้นทาง "รีเฟรชเมตา" ที่ผู้คนใช้เมื่อพวกเขาไม่รู้อะไรดีกว่านี้
rmeador

1
@rmeador ... สำหรับเบราว์เซอร์รุ่นเก่าและเบราว์เซอร์พิเศษ คุณควรทำส่วนหัว Location ของคุณก่อนหากล้มเหลวมีการเปลี่ยนเส้นทางเมตาด้วย "คุณจะถูกเปลี่ยนเส้นทางไปยังหน้าเว็บในเวลา x วินาที" พร้อมลิงค์ในกรณีที่การเปลี่ยนเส้นทางเมตาล้มเหลว นั่นเป็นวิธีที่เหมาะสมและไม่ปลอดภัยในการเปลี่ยนเส้นทาง
Andrew Moore

3
แอนดรูว์: เบราว์เซอร์ HTTP จะไม่เคารพตำแหน่งได้อย่างไร:?
vartec

102

เอาท์พุท JavaScript จาก PHP โดยใช้ echo ซึ่งจะทำงาน

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

คุณไม่สามารถทำได้ใน PHP จริงๆเว้นแต่คุณจะบัฟเฟอร์การแสดงผลหน้าแล้วตรวจสอบเงื่อนไขการเปลี่ยนเส้นทางในภายหลัง นั่นอาจเป็นเรื่องยุ่งยากมากเกินไป โปรดจำไว้ว่าส่วนหัวเป็นสิ่งแรกที่ส่งจากหน้าเว็บ การเปลี่ยนเส้นทางส่วนใหญ่มักจะต้องการในภายหลังในหน้า เพื่อที่คุณจะต้องบัฟเฟอร์ผลลัพธ์ทั้งหมดของหน้าและตรวจสอบเงื่อนไขการเปลี่ยนเส้นทางในภายหลัง ณ จุดนี้คุณสามารถเปลี่ยนเส้นทางส่วนหัวของหน้าผู้ใช้ () หรือเพียงแค่สะท้อนเอาต์พุตบัฟเฟอร์

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการบัฟเฟอร์ (ข้อดี)

บัฟเฟอร์เอาต์พุตคืออะไร


2
ง่ายและตรงประเด็นคำตอบ! ยอดเยี่ยมสำหรับการเปลี่ยนเส้นทางหน้าง่าย!
Stathis Andronikos

และวิธีการที่คุณไม่พบCannot modify header information - headers already sent byข้อผิดพลาดทั่วไป
Kai Noack

1
@hmd จะเกิดอะไรขึ้นถ้า javascript ถูกปิดใช้งาน
Istiaque Ahmed

@IstiaqueAhmed javascript เปิดใช้งานเกือบทุกวันนี้ แต่ถ้ามันถูกปิดใช้งานคุณสามารถใช้ PHP buffer ได้ คำถาม SO นี้ตอบว่า หากคุณใช้ PHP Buffering คุณไม่จำเป็นต้องใช้วิธีนี้เลย
Hammad Khan

เท็จคุณสามารถ (และควร) ทำใน PHP ได้โดยไม่ต้องบัฟเฟอร์: ในหน้าออกแบบที่ดีการประมวลผล PHP ที่เกี่ยวข้องทั้งหมดควรเกิดขึ้นก่อนที่เนื้อหา HTML ใด ๆ จะถูกส่งไปยังผู้ใช้ ด้วยวิธีนี้การเปลี่ยนเส้นทางของ PHP จะทำงานได้ดี
MestreLion

91

1. การใช้ฟังก์ชั่นส่วนหัวด้วย exit()

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

แต่ถ้าคุณใช้ฟังก์ชั่นส่วนหัวแล้วบางครั้งคุณจะได้รับ"คำเตือนเช่นส่วนหัวแล้วส่ง"เพื่อแก้ไขที่ไม่ได้สะท้อนหรือพิมพ์ก่อนที่จะส่งส่วนหัวหรือคุณสามารถใช้die()หรือexit()หลังจากฟังก์ชั่นส่วนหัว

2. ไม่มีส่วนหัว

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

ที่นี่คุณจะไม่ประสบปัญหาใด ๆ

3. การใช้ฟังก์ชันส่วนหัวด้วย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
?>

ทำงานเหมือนจับใจ ฉันใช้ <? php echo "<script> location.href = ' google.fr /'; </script >"; ?> เพื่อทดสอบและทำในสิ่งที่ฉันต้องการ
DoctorDroid Haiti

1
วิธีที่สองจะไม่ทำงานเมื่อปิดการใช้งาน JS
Tajni

55

คำตอบส่วนใหญ่จะลืมขั้นตอนที่สำคัญมาก !

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

ออกจากที่บรรทัดที่สองที่สำคัญออกมาอาจเห็นคุณจบลงในเดอะเดลี่ WTF ปัญหาคือเบราว์เซอร์ไม่ต้องเคารพส่วนหัวที่หน้าของคุณกลับมาดังนั้นเมื่อมีการข้ามส่วนหัวไปส่วนที่เหลือของหน้าจะถูกดำเนินการโดยไม่มีการเปลี่ยนเส้นทาง


1
เกี่ยวกับการส่งออกบางส่วนให้กับผู้ใช้ก่อนที่จะฆ่าสคริปต์? คุณจะรู้ว่าคนรักที่จะรู้ว่าอะไรคือ happenin ...
Straßeการเดินทาง

3
คุณกำลังสมมติว่าสคริปต์นั้นไม่มีอะไรทำนอกจากเปลี่ยนเส้นทาง ซึ่งอาจไม่เป็นความจริง แต่อย่างใด
vartec

13
@ Daniel: เปลี่ยนมันจะตาย ( "หยุดไม่สนใจส่วนหัวของฉัน!")
nickf

3
ฉันชอบคำอธิบายง่ายๆที่die();คุณให้ - ถ้าคุณไม่ทำมันผู้ใช้อาจเห็นหน้าสมบูรณ์สักครู่ถ้าคุณใช้มัน; ผู้ใช้จะถูกเปลี่ยนเส้นทางและไม่มีเนื้อหาผิดพลาดชั่วคราวจะแสดง + 1
TheBlackBenzKid

เป็นไปได้ที่จะมีกิจกรรมที่มีประโยชน์เกิดขึ้นหลังจากที่มีการส่งส่วนหัว, กิจกรรมที่ไม่ส่งอะไรไปยังเบราว์เซอร์ แต่บันทึกกิจกรรมหรือทำธุรกรรมการบันทึกเสร็จสิ้น ด้วยเหตุผลนี้ความจำเป็นในการตาย / ออกจะขึ้นอยู่กับสคริปต์
DanAllen

28

ใช้:

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

หรือถ้าคุณเปิดแท็ก PHP ให้ใช้สิ่งนี้:

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

คุณยังสามารถเปลี่ยนเส้นทางไปยังหน้าภายนอกเช่น:

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

ตรวจสอบให้แน่ใจว่าคุณมีหรือรวมexit()die()


25

คุณสามารถใช้ตัวแปรเซสชันเพื่อควบคุมการเข้าถึงหน้าต่างๆและให้สิทธิ์ผู้ใช้ที่ถูกต้องเช่นกัน:

<?php
    session_start();

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

    // Page goes here
?>

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

เมื่อเร็ว ๆ นี้ฉันได้รับการโจมตีทางไซเบอร์และตัดสินใจฉันจำเป็นต้องรู้ว่าผู้ใช้พยายามเข้าถึงแผงการดูแลระบบหรือส่วนที่สงวนไว้ของเว็บแอปพลิเคชัน

ดังนั้นฉันจึงเพิ่มการเข้าถึงบันทึกสำหรับที่อยู่ IP และเซสชันผู้ใช้ในไฟล์ข้อความเพราะฉันไม่ต้องการรบกวนฐานข้อมูลของฉัน


19

คำตอบเหล่านี้จำนวนมากถูกต้อง แต่พวกเขาคิดว่าคุณมี URL ที่แน่นอนซึ่งอาจไม่เป็นเช่นนั้น หากคุณต้องการใช้URL แบบสัมพัทธ์และสร้างส่วนที่เหลือคุณสามารถทำสิ่งนี้ได้ ...

$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' );


มีวิธีใดที่จะเปลี่ยนเส้นทางก่อนที่เบราว์เซอร์ตรวจพบโปรโตคอล HTTP? เหตุผลที่ฉันต้องเปลี่ยนเส้นทางคือเพราะฉันไม่สามารถรับใบรับรอง SSL เพียงพอสำหรับโดเมนทั้งหมดของฉัน ฉันจะใช้.htaccessเพื่อเปลี่ยนเส้นทาง แต่ฉันต้องการวิธีส่งผ่านโดเมนใดที่เปลี่ยนเส้นทางไปยังโดเมนสุดท้าย
oldboy


14

ฉันได้ตอบคำถามนี้ไปแล้ว แต่ฉันจะทำอีกครั้งเนื่องจากในขณะเดียวกันฉันได้เรียนรู้ว่ามีกรณีพิเศษหากคุณกำลังทำงานใน CLI (การเปลี่ยนเส้นทางไม่สามารถเกิดขึ้นได้ดังนั้นไม่ควรทำexit()) หรือหากเว็บเซิร์ฟเวอร์ของคุณเป็น ใช้ PHP เป็น CGI (F) (ต้องมีStatusส่วนหัวที่ตั้งไว้ก่อนหน้านี้เพื่อเปลี่ยนเส้นทางอย่างถูกต้อง)

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();
    }
}

ฉันยังได้รับการจัดการปัญหาในการสนับสนุนการเปลี่ยนเส้นทาง HTTP รหัสที่แตกต่างกัน ( 301, 302, 303และ307) เพราะมันเป็น addressed ในความคิดเห็นของคำตอบก่อนหน้าของฉัน นี่คือคำอธิบาย:

  • 301 - ย้ายอย่างถาวร
  • 302 - พบ
  • 303 - ดูเรื่องอื่น ๆ
  • 307 - การเปลี่ยนเส้นทางชั่วคราว (HTTP / 1.1)

11

หากต้องการเปลี่ยนเส้นทางผู้เยี่ยมชมไปยังหน้าอื่น (มีประโยชน์โดยเฉพาะในการวนซ้ำแบบมีเงื่อนไข) เพียงใช้รหัสต่อไปนี้:

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

ในกรณีนี้mypage.phpคือที่อยู่ของหน้าเว็บที่คุณต้องการเปลี่ยนเส้นทางผู้เข้าชม ที่อยู่นี้อาจเป็นที่แน่นอนและอาจรวมถึงพารามิเตอร์ในรูปแบบนี้:mypage.php?param1=val1&m2=val2)

เส้นทางสัมพัทธ์ / สัมบูรณ์

เมื่อจัดการกับพา ธ สัมพัทธ์หรือพา ธ สัมบูรณ์จะเป็นการดีที่จะเลือกพา ธ สัมบูรณ์จากรูทของเซิร์ฟเวอร์ (DOCUMENT_ROOT) ใช้รูปแบบต่อไปนี้:

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

หากหน้าเป้าหมายเคยอยู่บนเซิร์ฟเวอร์อื่นคุณจะต้องใส่ URL แบบเต็ม:

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

ส่วนหัว HTTP

ตามโปรโตคอล HTTP ส่วนหัว HTTP จะต้องส่งbeforeเนื้อหาทุกประเภท ซึ่งหมายความว่าไม่ควรส่งอักขระก่อนส่วนหัว - ไม่เว้นแม้แต่ช่องว่าง!

การเปลี่ยนเส้นทางชั่วคราว / ถาวร

ตามค่าเริ่มต้นประเภทของการเปลี่ยนเส้นทางที่แสดงข้างต้นเป็นประเภทชั่วคราว ซึ่งหมายความว่าเครื่องมือค้นหาเช่น Google Search จะไม่คำนึงถึงการเปลี่ยนเส้นทางเมื่อทำการจัดทำดัชนี

หากคุณต้องการแจ้งให้เครื่องมือค้นหาทราบว่าหน้าเว็บถูกย้ายไปที่อื่นอย่างถาวรให้ใช้รหัสต่อไปนี้:

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

ตัวอย่างเช่นหน้านี้มีรหัสต่อไปนี้:

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

เมื่อคุณคลิกที่ลิงก์ด้านบนคุณจะถูกนำไปที่หน้านี้โดยอัตโนมัติ นอกจากนี้ยังเป็นการเปลี่ยนเส้นทางถาวร (สถานะ: 301 ถูกย้ายอย่างถาวร) ดังนั้นหากคุณพิมพ์ URL แรกใน Google คุณจะถูกเปลี่ยนเส้นทางไปยังลิงก์ที่สองซึ่งถูกเปลี่ยนเส้นทางโดยอัตโนมัติ

การตีความรหัส PHP

รหัส PHP ที่อยู่หลังส่วนหัว () จะถูกตีความโดยเซิร์ฟเวอร์แม้ว่าผู้เข้าชมจะย้ายไปยังที่อยู่ที่ระบุในการเปลี่ยนเส้นทาง ในกรณีส่วนใหญ่หมายความว่าคุณต้องมีวิธีการตามheader()ฟังก์ชั่นของexit()ฟังก์ชั่นเพื่อลดภาระของเซิร์ฟเวอร์:

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

ทำไม(ใกล้ถึงจุดสิ้นสุดของย่อหน้าที่สอง) คุณหมายถึงคนอื่น&paraแทนmypage.php?param1=val1&param2=val2)หรือเปล่า? (กิจการ HTML พิทักษ์ ) เป็น "¶" - บางทีบางโปรแกรมภายนอกได้แปลง)?
ปีเตอร์มอร์เทนเซ่น

9

ใช้:

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

นี่คือการเปลี่ยนเส้นทาง PHP ปกติและปกติ แต่คุณสามารถสร้างหน้าเปลี่ยนเส้นทางโดยรอสักครู่ด้วยโค้ดด้านล่าง:

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

7

ในวันก่อนวันที่เว็บความหมายความถูกต้องเป็นสิ่งที่ต้องพิจารณา น่าเสียดายที่ "ตำแหน่ง" ของ PHP - ส่วนหัวยังคงใช้รหัสHTTP 302 -redirect ซึ่งอย่างเคร่งครัดไม่ใช่รหัสที่ดีที่สุดสำหรับการเปลี่ยนเส้นทาง หนึ่งมันควรจะใช้แทนเป็น303อย่างใดอย่างหนึ่ง

W3C ใจดีพอที่จะกล่าวถึงว่าส่วนหัว 303 ไม่เข้ากันกับ "เอเจนต์ผู้ใช้ pre-HTTP / 1.1 จำนวนมาก" ซึ่งจะไม่มีเบราว์เซอร์ที่ใช้งานอยู่ในปัจจุบัน ดังนั้น 302 จึงเป็นของที่ระลึกซึ่งไม่ควรใช้

... หรือคุณอาจเพิกเฉยเหมือนคนอื่น ...


7

คุณสามารถใช้วิธีการจาวาสคริปต์บางอย่างเช่นด้านล่าง

  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 ทำงานบนไคลเอนต์ซึ่งอาจจะใช่หรือไม่ใช่สิ่งที่คุณกำลังมองหา
chharvey

7

ใช่คุณสามารถใช้ส่วนหัว ()ฟังก์ชั่น

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

และวิธีปฏิบัติที่ดีที่สุดคือการเรียกใช้ฟังก์ชันexit ()หลังจากheader()ฟังก์ชั่นเพื่อหลีกเลี่ยงการเรียกใช้โค้ดด้านล่าง

ตามเอกสารheader()จะต้องถูกเรียกก่อนที่จะส่งออกจริงใด ๆ


6

เช่นเดียวกับคนอื่น ๆ ที่นี่กล่าวว่าการส่งส่วนหัวของตำแหน่งด้วย:

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

แต่คุณต้องทำก่อนที่จะส่งผลลัพธ์อื่น ๆ ไปยังเบราว์เซอร์

นอกจากนี้หากคุณจะใช้สิ่งนี้เพื่อบล็อกผู้ใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์จากบางหน้าเช่นที่คุณกล่าวถึงโปรดทราบว่าตัวแทนผู้ใช้บางรายจะไม่สนใจสิ่งนี้และดำเนินการต่อในหน้าปัจจุบันต่อไปดังนั้นคุณจะต้องตาย ) หลังจากที่คุณส่ง


but you need to do it before you've sent any other output to the browser. น่ากลัว !! รับการค้นหานาทีว่าทำไมฉันยังคงได้รับส่วนหัวส่งข้อผิดพลาดแล้ว 1 !!
josh

โดยทั่วไปคุณมี / หยุดสคริปต์ของคุณอย่างสมบูรณ์ / die()เป็นเพียงวิธีหนึ่งในการทำเช่นนั้น
MauganRa

6

นี่คือความคิดของฉัน:

IMHO วิธีที่ดีที่สุดในการเปลี่ยนเส้นทางคำขอที่เข้ามาคือการใช้ส่วนหัวสถานที่ตั้ง

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

เมื่อคำสั่งนี้ถูกดำเนินการและส่งออกเบราว์เซอร์จะเริ่มนำผู้ใช้อีกครั้ง อย่างไรก็ตามตรวจสอบให้แน่ใจว่าไม่มีการแสดงผลใด ๆ (echo / var_dump ใด ๆ ) ก่อนส่งส่วนหัวมิฉะนั้นจะทำให้เกิดข้อผิดพลาด

แม้ว่านี่จะเป็นวิธีที่รวดเร็วและสกปรกเพื่อให้ได้สิ่งที่ถูกถามมา แต่ในที่สุดมันก็กลายเป็นหายนะ SEO เนื่องจากการเปลี่ยนเส้นทางประเภทนี้มักจะถูกตีความว่าเป็นการเปลี่ยนเส้นทาง 301/302 ดังนั้นเครื่องมือค้นหาจะเห็นคุณเสมอ หน้าดัชนีเป็นหน้าที่ชี้นำใหม่และไม่ใช่หน้า Landing Page / หน้าหลัก

ดังนั้นมันจะส่งผลต่อการตั้งค่า SEO ของเว็บไซต์


1
ควรใช้ exit () ทันทีหลังจากส่วนหัว ()
EKanadily

@docesam .. ตกลง .. exit () ควรถูกเรียกทันทีหลังจากเรียก header () อย่างไรก็ตามฉันรู้สึกว่าหากไม่มีการส่งออกไปยังเบราว์เซอร์อีกต่อไปหลังจากคำสั่ง header () นี้ exit () อาจไม่จำเป็น - แค่ความเห็นของฉัน
Bhaskar Pramanik

ใช่ แต่คุณต้องอธิบายว่าเพราะมีใครบางคนสามารถคัดลอกบรรทัดโค้ดของคุณไปยังสคริปต์ของเขาและอาจทำให้เกิดการวนรอบนานในการหาว่าเกิดอะไรผิดพลาด
EKanadily

1
@BhaskarPramanik จินตนาการว่าคุณต้องล็อคประตูอย่างรวดเร็ว แต่คุณต้องดึง / ดัน / ทุบอีกครั้งเพื่อให้แน่ใจว่าล็อคแล้วหรือไม่ ..
aswzen

5

วิธีที่ดีที่สุดในการเปลี่ยนเส้นทางด้วย PHP คือรหัสต่อไปนี้ ...

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

ตรวจสอบให้แน่ใจว่าไม่มีรหัสจะทำงานหลังจาก

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

รหัสทั้งหมดจะต้องถูกดำเนินการก่อนที่บรรทัดข้างต้น

สมมติ,

กรณีที่ 1:

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

มันจะเปลี่ยนเส้นทางไปยังตำแหน่งที่ถูกต้อง (index.php)

กรณีที่ 2:

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

รหัสด้านบนจะไม่เปลี่ยนเส้นทางไปยังที่ตั้ง (index.php)


มีคำตอบที่มี 1,085 ที่มีข้อมูลที่คุณให้ไว้แล้วรวมทั้งอีกมากมาย
Patrick Hund

5

ใช่เป็นไปได้ที่จะใช้ PHP เราจะเปลี่ยนเส้นทางไปยังหน้าอื่น

ลองรหัสต่อไปนี้:

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

4

1. การใช้headerฟังก์ชั่น PHP ในตัว

a) เปลี่ยนเส้นทางอย่างง่าย ๆ โดยไม่มีพารามิเตอร์

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

b) เปลี่ยนเส้นทางด้วยพารามิเตอร์ GET

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

2. เปลี่ยนเส้นทางด้วย JavaScript ใน PHP

a) เปลี่ยนเส้นทางอย่างง่าย ๆ โดยไม่มีพารามิเตอร์

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

b) เปลี่ยนเส้นทางด้วยพารามิเตอร์ GET

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

จาวาสคริปต์บิตเป็นสิ่งเดียวที่ทำงานในการโฮสต์สุดท้ายของไซต์ ฉันเชื่อว่ามันเป็นเรื่องของการแคช แต่เมื่อฉันแก้ไขมันแล้ว
cdsaenz

3

เราสามารถทำได้สองวิธี:

  1. เมื่อผู้ใช้มาที่https://bskud.com/PINCODE/BIHAR/index.phpให้เปลี่ยนเส้นทางไปที่https://bskud.com/PINCODE/BIHAR.php

    โดยรหัส PHP ด้านล่าง

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

    บันทึกรหัสด้านบนในhttps://bskud.com/PINCODE/BIHAR/index.php

  2. เมื่อเงื่อนไขใด ๆ เป็นจริงให้เปลี่ยนเส้นทางไปยังหน้าอื่น:

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

นี่คืออะไร? กรุณาอย่าใช้ลิงค์ไปยังเว็บไซต์ของคุณเอง และตัวอย่างที่สองใช้การเปลี่ยนเส้นทาง javascript ไม่ใช่header()ฟังก์ชันPHP
Scriptman

2

ใช้:

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

1
คุณสามารถอธิบายฟังก์ชั่นของรหัสของคุณได้หรือไม่? คำตอบของคุณถูกตั้งค่าสถานะเนื่องจากความยาวและเนื้อหา
www139

2

มีหลายวิธีในการทำเช่นนี้ แต่ถ้าคุณต้องการphpฉันขอแนะนำให้ใช้header()ฟังก์ชั่น

เป็นพื้น

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

หากคุณต้องการที่จะทำให้มันเป็นรอยที่ดีที่สุดที่จะใช้มันในฟังก์ชั่น ด้วยวิธีนี้คุณสามารถเพิ่มการรับรองความถูกต้องและการตรวจสอบองค์ประกอบอื่น ๆ

มาลองด้วยการตรวจสอบระดับของผู้ใช้

u_authดังนั้นสมมติว่าคุณเก็บไว้ในระดับผู้มีอำนาจของผู้ใช้ในเซสชั่นที่เรียกว่า

ใน 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;
        }
     }

     . . .

จากนั้นคุณจะเรียกใช้ฟังก์ชันนี้สำหรับทุกหน้าที่คุณต้องการตรวจสอบสิทธิ์

กดpage.phpไลค์ในหรือหน้าอื่น ๆ

<?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”);

    . . .

อ้างอิง;



2

การใช้ฟังก์ชั่นส่วนหัวสำหรับการกำหนดเส้นทาง

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

สมมติว่าเราต้องการที่จะเดินทางจากA.phpไฟล์B.phpกว่าที่เราต้องใช้ความช่วยเหลือของหรือ<button> <a>ให้ดูตัวอย่าง

<?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>

คุณสามารถให้โซลูชันที่ถูกต้องหรือดีหรือไม่?
Mehedi Abdullah

มีวิธีแก้ไขปัญหาอยู่มากมาย โซลูชันของคุณผสม HTML และ PHP โดยไม่มีแท็ก PHP ประการที่สองคุณส่งหัวหลังจากพิมพ์รหัส html ดังนั้นมันจะไม่ทำงาน และชื่อของไฟล์ตัวอย่างนั้นไม่ดี คุณไม่ควรตั้งชื่อ A.php และ B.php ฉันรู้ว่านั่นเป็นเพียงตัวอย่าง แต่คุณก็ควรใส่ใจเรื่องการตั้งชื่อ
Tajni

1

หากคุณใช้งาน Apache คุณสามารถใช้. htaccess เพื่อเปลี่ยนเส้นทาง

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

1

คุณสามารถลองใช้งาน PHP ได้ headerฟังก์ชันเพื่อทำการเปลี่ยนเส้นทาง คุณจะต้องตั้งค่าบัฟเฟอร์ผลลัพธ์เพื่อให้เบราว์เซอร์ของคุณไม่ส่งสัญญาณเตือนการเปลี่ยนเส้นทางไปที่หน้าจอ

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

1
ควรใช้ exit () หลังส่วนหัว () การบัฟเฟอร์ออกโดยอัตโนมัติเป็นค่าเริ่มต้นในขณะนี้
EKanadily

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.