redirect get - 如何在PHP中進行重定向?




html meta (23)

其中許多答案都是正確的,但是他們認為你有一個絕對的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

是否可以通過使用PHP將用戶重定向到其他頁面?

假設用戶訪問www.example.com/page.php ,我想將它們重定向到www.example.com/index.php ,但如何在不使用元刷新的情況下這樣做? 可能?

這甚至可以保護我的網頁免受未經授權的使用


有多種方法可以做到這一點,但如果你喜歡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”

authRedirect($_SESSION[‘u_auth’], 5);  // redirects to www.example.com/index.php if the user isn’t auth level 5
authRedirect($_SESSION[‘u_auth’], 4);  // redirects to www.example.com/index.php if the user isn’t auth level 4
authRedirect($_SESSION[‘u_auth’], 2, “www.someotherplace.com/somepage.php”);  // redirects to www.someotherplace.com/somepage.php if the user isn’t auth level 2


. . . 

我希望你會發現一些有用的內容

參考;


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

或者如果你已經打開php標籤,使用這個:

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

您也可以重定向到外部頁面,例如:

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

確保你包含exit()include die()


我們可以採取兩種方式

  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 Website Name Again</b>"; } ?>

`



像其他人說的那樣,發送位置標題:

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

但是在將任何其他輸出發送到瀏覽器之前,您需要執行此操作。

此外,如果您要使用此功能阻止未經身份驗證的用戶訪問特定頁面(請注意,有些用戶代理thedailywtf.com/Articles/WellIntentioned-Destruction.aspx並繼續在當前頁面上進行操作,因此您需要死掉)發送後。


1.使用header函數和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
?>

你可以使用下面的一些Java腳本方法

 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");

是的,可以使用PHP,我們將重定向到另一個頁面,試試這個:

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

可能來不及回答這個問題。 不過,這是我的想法:

恕我直言,重新引導傳入請求的最佳方式是使用位置標題,即可

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

一旦執行了此語句,並且輸出已發出,瀏覽器將開始重新指導用戶。 但是,確保在發送頭文件之前沒有任何輸出(任何echo / var_dump),否則會導致錯誤。

雖然這是一種快速和骯髒的方式來實現原來的要求,但它最終會變成SEO災難,因為這種重新定向總是被解釋為301/302重定向,因此搜索引擎將會始終將您的索引頁面視為重定向頁面,而不是登錄頁面/主頁面。 因此它會影響網站的SEO設置。


您可以嘗試使用php頭函數來進行重定向。 您將需要設置輸出緩衝區,以便您的瀏覽器不會向屏幕發出重定向警告。

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

要將訪問者重定向到另一個頁面(在條件循環中特別有用),只需使用以下代碼:

<?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任何類型的內容before發送。 這意味著在標題之前不應該發送任何字符 - 甚至不是空的空間!

臨時/永久重定向

默認情況下,上面介紹的重定向類型是臨時類型。 這意味著搜索引擎(如Google)在索引編制時不會考慮重定向。

如果您想通知搜索引擎一個頁面已永久移動到其他位置,請使用以下代碼:

<? 
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)。 因此,如果您在Google中輸入第一個網址,系統會自動將您重定向到第二個重定向鏈接。

PHP代碼的解釋

即使訪問者移動到重定向中指定的地址,位於header()之後的PHP代碼也會被服務器解釋。 在大多數情況下,這意味著您需要一種方法來跟踪exit()函數的header()函數,以減少服務器的負載:

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

使用header()函數發送HTTP Location標題

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

結果或3次執行:

[email protected]:~> 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執行。


如果你在Apache上運行,你也可以使用.htaccess進行重定向。

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

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


我已經回答了這個問題,但我會再次這樣做,因為在此期間,我已經了解到,如果您在CLI中運行(重定向不能發生,因此不應該exit() ),或者您的網絡服務器將PHP作為(F)CGI運行(它需要先前設置的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重定向代碼( 301307 )的問題,因為它在我之前的回答的評論中提到,下面是描述:

  • 301 - 永久移動
  • 302 - 找到
  • 303 - 見其他
  • 307 - 臨時重定向(HTTP / 1.1)

使用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)。

希望很明顯。


使用echo從PHP輸出JavaScript,它將完成這項工作。

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

除非您緩衝頁面輸出,然後再檢查重定向條件,否則您無法在PHP中真正做到這一點。 這可能太麻煩了。 請記住,標題是從頁面發送的第一件東西。 大部分重定向通常在頁面稍後需要。 為此,您必須緩衝頁面的所有輸出,並稍後檢查重定向條件。 此時,您可以重定向頁面用戶標題()或簡單地回顯緩衝的輸出。

有關緩衝的更多信息(優點)

什麼是輸出緩衝?


是的,你可以使用header()函數,

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

最好的做法是在header()函數之後立即調用exit()函數,以避免執行下面的代碼。

根據文檔,必須在發送任何實際輸出之前調用header()


你可以更新php: header


這些答案中的大部分都忘記了一個非常重要的步驟!

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

離開這個重要的第二條線可能會看到你最終在thedailywtf.com/Articles/WellIntentioned-Destruction.aspx 。 問題在於瀏覽器不必尊重頁面返回的標題,因此在頁眉被忽略的情況下,頁面的其餘部分將在沒有重定向的情況下執行。


現有答案總結加我自己的兩分錢:

1.基本答案

您可以使用header()函數發送新的HTTP標頭,但必須在HTML或文本之前將其發送到瀏覽器(例如​​,在<!DOCTYPE ...>聲明之前)。

header('Location: '.$newURL);

2.重要細節

die()exit()

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

為什麼你應該使用die()exit()thedailywtf.com/Articles/WellIntentioned-Destruction.aspx

絕對網址

該網址必須是絕對的。 請參閱RFC 2616 。 但在大多數情況下,相對URL也會被接受。

狀態碼

PHP的“位置”標題仍然使用HTTP 302重定向代碼,但這不是你應該使用的。 您應該考慮301 (永久重定向)或303 (其他)。

注意: W3C提到 303-header與“許多pre-HTTP / 1.1用戶代理不兼容,目前使用的瀏覽器都是HTTP / 1.1用戶代理,對於許多其他用戶代理(如蜘蛛和機器人)來說並不是這樣。

3.文件

HTTP頭和PHP中的header()函數

4.替代品

您可以使用http_redirect($url);的替代方法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輸出,它們通常會失敗。 然後,您可以使用HTML標頭解決方法(不是很專業!),如:

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

或甚至JavaScript重定向。

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

我只想鎖定整個頁面的任何ajax請求。 @SuperG讓我開始了。 這是我最終的結果:

// redirect ajax requests that are redirected, not found (404), or forbidden (403.)
$('body').bind('ajaxComplete', function(event,request,settings){
        switch(request.status) {
            case 301: case 404: case 403:                    
                window.location.replace("http://mysite.tld/login");
                break;
        }
});

我想專門檢查某些http狀態碼以作為我的決定依據。 然而,你可以綁定到ajaxError去獲得除了成功之外的任何東西(也許只有200個?)我可以寫下:

$('body').bind('ajaxError', function(event,request,settings){
    window.location.replace("http://mysite.tld/login");
}




php redirect