Kaip nukreipti į PHP?

Ar galiu perkelti vartotoją į kitą puslapį naudodamas PHP?

Papasakokite vartotojui eiti į www.example.com/page.php , ir noriu juos nukreipti į www.example.com/index.php , kaip tai padaryti nenaudojant meta-atnaujinimo? Ar tai įmanoma?

Jis netgi gali apsaugoti mano puslapius nuo neleistinų naudotojų.

1048
20 апр. Sam yra nustatytas balandžio 20 d. 2009-04-20 17:13 '09 at 17:13 PM 2009-04-20 17:13
@ 28 atsakymai

Esamų atsakymų santrauka ir mano du centai:

1. Pagrindinis atsakymas

Galite naudoti header() funkciją, kad išsiųstumėte naują HTTP antraštę, tačiau tai turi būti siunčiama į naršyklę prieš bet kokį HTML ar tekstą (pvz., Prieš paskelbiant <!DOCTYPE...> ).

 header('Location: '.$newURL); 

2. Svarbi informacija

mirti () arba išeiti ()

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

Kodėl turėtumėte naudoti die() arba exit() : „Daily WTF“

Absoliutus arba santykinis URL

Nuo 2014 m. Birželio mėn. Galima naudoti absoliučius ir santykinius URL. Žr. RFC 7231, kuris pakeitė senąjį RFC 2616 , kuriame leidžiama naudoti tik absoliučius URL.

Būsenos kodai

PHP „Location“ („Vietovė“) vis dar naudoja HTTP kodą 302 -redirect, bet tai ne tas, kurį turėtumėte naudoti. Turėtumėte apsvarstyti 301 (nuolatinis peradresavimas) arba 303 (kitas).

Pastaba: „ W3C“ nurodo, kad 303-šokėjas yra nesuderinamas su daugeliu prieš HTTP / 1.1 naudotojų agentų. Šiuo metu naršyklės naudoja visus HTTP / 1.1 naudotojų agentus. Tai netinka daugeliui kitų naudotojų agentų, pvz., Vorų ir robotų.

3. Dokumentacija

HTTP antraštės ir PHP header() funkcija

4. Alternatyvos

Galite naudoti alternatyvų http_redirect($url); metodą http_redirect($url); kuris reikalauja įdiegti PECL paketą .

5. Pagalbinės funkcijos

Į šią funkciją neįeina būsenos kodas 303:

 function Redirect($url, $permanent = false) { header('Location: ' . $url, true, $permanent ? 301 : 302); exit(); } Redirect('http://example.com/', false); 

Jis yra lankstesnis:

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

6. Sprendimas

Kaip minėta, header() nukreipia darbą tik prieš tai, kai viskas yra parašyta. Paprastai jie nepavyksta, jei yra naudojamas HTML failas . Tada galite naudoti HTML antraštės judėjimą (ne labai profesionaliai!), Pavyzdžiui:

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

Arba iš naujo apibrėžkite javascript.

 window.location.replace("http://example.com/"); 
1490 m
20 апр. atsakymas į markus balandžio 20 d. 2009-04-20 17:19 '09, 17:19 2009-04-20 17:19
 function Redirect($url, $permanent = false) { if (headers_sent() === false) { header('Location: ' . $url, true, ($permanent === true) ? 301 : 302); } exit(); } Redirect('http://www.google.com/', false); 
border=0

Nepamirškite mirti () / išeiti ()!

98
20 апр. Alix Axel atsakymas 20 Bal 2009-04-20 17:19 '09, 17:19 2009-04-20 17:19

Parašykite „JavaScript“ iš php naudojant aidą, kuris atliks darbą.

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

Tai negalite atlikti PHP, nebent jūs išplaukiate puslapio išvestį, tada patikrinkite siuntimo būseną. Tai gali būti per daug problemų. Atminkite, kad antraštės yra pirmosios, kurios bus siunčiamos iš puslapio. Dauguma peradresavimų paprastai reikalingi vėliau puslapyje. Kad tai padarytumėte, reikia išvalyti visą puslapio išvestį ir vėliau patikrinti siuntimo būseną. Šiuo metu galite nukreipti naudotojo puslapio antraštę () arba tiesiog atsikartoti išvestį.

Sužinokite daugiau apie buferį (naudą)

Kas yra išvesties buferis?

91
27 июня '14 в 10:24 2014-06-27 10:24 atsakymą pateikė Hammad Khan birželio 27 d. 14 d. 10:24 2014-06-27 10:24

HTTP antraštės antraštės siuntimui naudokite header() funkciją :

 header('Location: '.$newURL); 

Skirtingai nuo kai kurių, die() neturi nieko bendro su peradresavimu. Naudokite tik tada, jei norite peradresuoti vietoj įprastinio vykdymo.

pavyzdys.php:

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

Rezultatas arba 3 įvykdymai:

 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 

Atnaujinimas - die() / exit() yra privaloma miesto legenda, kuri neturi nieko bendro su faktine PHP. Nėra ryšio su klientu „gerbiant“ „ Location: antraštę. Antraštės siuntimas nesustabdo PHP vykdymo, neatsižvelgiant į naudojamą klientą.

88
20 апр. atsakymas pateikiamas vartec, balandžio 20 d. 2009-04-20 17:14 '09, 17:14, 2009-04-20 17:14

1. Antraštės funkcijos naudojimas su exit()

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

bet jei naudojate antraštės funkciją, kartais gausite „įspėjimą kaip jau išsiųstą antraštę“ dėl leidimo, kuris nėra atspausdintas arba atspausdintas prieš siunčiant antraštę, arba galite tiesiog naudoti „ die() arba exit() po antraštės funkcijos.

2. Nenurodyta

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

čia jūs neturėsite jokių problemų

3. Antraštės funkcijos naudojimas su ob_start() ir 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 ?> 
60
13 апр. Juned Ansari paskelbė balandžio 13 dieną 2017-04-13 15:44 '17, 13:44 pm 2017-04-13 15:44

Dauguma šių atsakymų pamiršta svarbų žingsnį. !

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

Palikę šią svarbią antrąją eilutę, pamatysite, kad baigėte „Daily WTF“ . Problema ta, kad naršyklė neprivalo gerbti jūsų puslapio grąžintų antraščių, todėl, jei ignoruosite antraštes, likusi puslapio dalis bus vykdoma be peradresavimo.

51
20 апр. atsakymas pateikiamas nickf 20 balandžio. 2009-04-20 17:24 '09, 17:24, 2009-04-20 17:24
 <?php header('Location: another-php-file.php'); exit(); ?> 

arba jei jau atidarėte php žymes, naudokite:

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

Taip pat galite nukreipti į išorinius puslapius, pavyzdžiui:

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

Įsitikinkite, kad įtraukiate exit() arba include die()

23
16 мая '16 в 16:12 2016-05-16 16:12 Atsakymą pateikia jake gegužės 16, 16, 16:12 2016-05-16 16:12

Daugelis šių atsakymų yra teisingi, tačiau jie mano, kad turite absoliučią URL, o tai gali būti ne. Jei norite naudoti santykinį URL ir generuoti likusį, galite padaryti kažką panašaus ...

 $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 
18
15 янв. atsakymą pateikė Lukas 15 d. 2014-01-15 07:21 '14, 7:21 AM 2014-01-15 07:21

Sesijos kintamuosius galite naudoti norėdami kontroliuoti prieigą prie puslapių ir leisti naudoti galiojančius naudotojus.

 <?php session_start(); if ( !isset( $_SESSION["valid_user"]) ) { header("location:../"); die(); } // Page goes here ?> 

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

Neseniai gavau kibernetinių atakų ir nusprendžiau, kad turiu žinoti, kad naudotojai bandė prisijungti prie administratoriaus skydelio arba rezervuotos interneto programos dalies.

todėl prie tekstinio failo pridėjau IP sesijos ir naudotojo sesijos, nes nenoriu nerimauti savo duomenų bazės.

17
09 сент. atsakymas pateikiamas Asuquo12 09 rugsėjis 2016-09-09 13:48 '16 at 13:48 pm 2016-09-09 13:48

Aš jau atsakiau į šį klausimą, bet aš darau tai dar kartą, nes tuo metu aš sužinojau, kad yra ypatingų atvejų, jei dirbate CLI (peradresavimas negali įvykti ir todėl neturėtų exit() ), arba jei jūsų tinklas yra -serveris dirba su PHP kaip (F) CGI (norint tinkamai persiųsti, reikalinga iš anksto nustatyta Status antraštė).

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

Taip pat aptariau įvairių HTTP nukreipimo kodų ( 301 , 302 , 303 ir 307 ) palaikymo klausimą, nes jis buvo aptartas ankstesnio atsakymo komentaruose, čia yra aprašymai:

  • 301 - perkelti amžinai
  • 302 - Rasta
  • 303 - žr. „Kita“
  • 307 - laikinas peradresavimas (HTTP / 1.1)
13
29 апр. Alix Axel atsakymas, pateiktas balandžio 29 d. 2011-04-29 00:31 '11 prie 0:31 2011-04-29 00:31

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

12
20 апр. Atsakyti Daniel A. White balandžio 20 2009-04-20 17:14 '09, 17:14, 2009-04-20 17:14
 header("Location: /index.php"); exit(0); 
10
12 янв. atsakymą pateikė joan16v 12 sausis 2015-01-12 14:03 '15, 14:03 val. 2015-01-12 14:03

Galite naudoti kai kuriuos Java scenarijų metodus, kaip parodyta žemiau.

  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"); 
8
12 марта '15 в 12:42 2015-03-12 12:42 atsakymą pateikė Vikramas Pote kovo 15 d. 15 val. 12:42 2015-03-12 12:42

Taip, galite naudoti antraštę () ,

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

Taip pat geriausia praktika skambinti išėjimo () funkcijai iškart po header() funkcijos, kad būtų išvengta kodo vykdymo.

Pagal dokumentaciją, prieš išsiųsdami bet kokią faktinę produkciją, turite skambinti header() .

7
28 нояб. Atsakymą pateikė „ CasperSL “ lapkričio 28 d. 2017-11-28 04:04 '17 at 4:04 2017-11-28 04:04
 <?php header('Location: redirectpage.php'); header('Location: redirectpage.php');exit(); echo "<script>location.href='redirectpage.php';"; ?> 

Tai yra reguliarus ir normalus PHP peradresavimas, bet galite nukreipti puslapį keliais sekundėmis žemiau kodo:

 <?php header('refresh:5;url=redirectpage.php '); //Note: here 5 means 5 seconds wait for redirect. ?> 
7
18 авг. atsakymą pateikė Obaidul Haque 18 rug . 2017-08-18 09:46 '17 ne 9:46 2017-08-18 09:46

Gali būti per vėlu atsakyti į šį klausimą. Tačiau čia yra mano mintys:

IMHO, geriausias būdas nukreipti gaunamą užklausą yra naudoti vietovės antraštes

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

Kai tik bus įvykdytas šis pareiškimas ir siunčiamas išėjimas, naršyklė nukreips vartotoją. Tačiau įsitikinkite, kad prieš siųsdami antraštes nebuvo jokio išėjimo (jokio echo / var_dump), kitaip tai sukels klaidų.

Nors tai yra greitas ir purvinas būdas pasiekti tai, kas iš pradžių buvo nustatyta, tačiau galiausiai tai bus SEO katastrofa, nes tokio tipo peradresavimas visada interpretuojamas kaip 301/302 peradresavimas, todėl paieškos sistemos visada matys jūsų indekso puslapį kaip nukreiptą puslapį. ir ne kažkas iš nukreipimo puslapio / pagrindinio puslapio. Todėl tai turės įtakos SEO nustatymams svetainėje.

6
28 янв. Atsakymą pateikė Bhaskar Pramanik sausio 28 d. 2017-01-28 17:48 '17 at 5:48 2017-01-28 17:48

Semantinio tinklo išvakarėse reikia atsižvelgti į teisingumą. Deja, PHP „Location“ („Vietovė“) vis dar naudoja HTTP 302 - specialų kodą, kuris, griežtai kalbant, nėra geriausias peradresavimas. Vietoj to turėtumėte naudoti 303 .

W3C pakanka paminėti , kad 303 antraštė yra nesuderinama su „keliais naudotojų agentais prieš HTTP / 1.1“, kuri bus naudojama be naršyklės. Taigi, 302 yra reliktas, kuris neturėtų būti naudojamas.

... arba galite tiesiog ignoruoti, kaip ir visi kiti ...

6
20 апр. Henrik Paul atsakymas, pateiktas balandžio 20 d 2009-04-20 23:25 '09, 23:25, 2009-04-20 23:25

Kaip ir kiti čia, siųskite vietos antraštę naudodami

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

bet tai reikia padaryti prieš siųsdami bet kurią kitą išvestį į naršyklę.

Be to, jei ketinate tai naudoti tam, kad blokuotumėte nepatvirtintus naudotojus iš tam tikrų puslapių, kaip minėjote, nepamirškite, kad kai kurie naudotojų agentai tai ignoruos ir tęsis dabartiniame puslapyje, taigi jums reikės mirti () po siuntimas.

6
20 апр. Atsakymas pateikiamas Brent 20 balandžio. 2009-04-20 17:23 '09, 17:23, 2009-04-20 17:23

Jei norite nukreipti lankytoją į kitą puslapį (ypač naudingą sąlyginę kilpą), tiesiog naudokite šį kodą:

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

Tokiu atveju mypage.php yra puslapio, į kurį norite nukreipti lankytojus, adresas. Šis adresas gali būti absoliutus ir taip pat gali apimti parametrus šiuo formatu: mypage.php?param1=val1¶m2=val2)

Santykinis / absoliutus kelias

Dirbdami su santykiniais arba absoliučiais keliais, idealiai pasirinkite absoliutų kelią iš serverio šaknies (DOCUMENT_ROOT). Naudokite šį formatą:

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

Jei nukreipimo puslapis visada yra kitame serveryje, įtraukiate visą URL:

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

HTTP antraštės

Pagal HTTP protokolą HTTP antraštės turi būti siunčiamos before bet kokio tipo turinį. Tai reiškia, kad prieš antraštę niekada nereikia siųsti simbolių, net tuščios vietos!

Laikinas / nuolatinis peradresavimas

Pirmiau nurodytas numatytasis nukreipimo tipas yra laikinas. Tai reiškia, kad paieškos sistemose, pvz., „Google“, indeksavimo metu nebus atsižvelgiama į peradresavimą.

Jei norite pranešti paieškos sistemoms, kad puslapis buvo nuolat perkeltas į kitą vietą, naudokite šį kodą:

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

Pavyzdžiui, šiame puslapyje yra toks kodas:

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

Spustelėję aukščiau pateiktą nuorodą, automatiškai nukreipiamas į šį puslapį. Be to, tai yra nuolatinis peradresavimas (statusas: 301 persikėlė amžinai). Taigi, jei įvedate pirmą „Google“ URL, automatiškai nukreipiamas į antrą nukreiptą nuorodą.

PHP kodo aiškinimas

PHP kodas, esantis po antraštės (), bus interpretuojamas serverio, net jei lankytojas persikels į nukreipime nurodytą adresą. Daugeliu atvejų tai reiškia, kad norint sumažinti serverio apkrovą, jums reikia metodo, kad būtų galima stebėti exit() funkcijos header() funkciją:

 <? header('Status: 301 Moved Permanently', false, 301); header('Location: address'); exit(); ?> 
5
13 февр. Atsakymas pateikiamas Žvaigždutė 13 vasaris. 2018-02-13 12:26 '18, 12:26 pm 2018-02-13 12:26

Geriausias būdas perorientuoti su PHP yra šis kodas ...

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

Įsitikinkite, kad kodas neveiks

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

Visi kodai turi būti užpildyti prieš pirmiau nurodytą eilutę.

Tarkime

1 atvejis:

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

Jis bus teisingai nukreiptas į vietą (index.php).

2 atvejis:

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

Pirmiau nurodytas kodas nebus nukreiptas į vietą (index.php).

Tikiuosi, kad tai aišku.

5
09 апр. atsakymas pateikiamas sabuz 09 balandžio. 2017-04-09 11:37 '17 at 11:37 2017-04-09 11:37

Taip, galima naudoti PHP, nukreipsime į kitą puslapį, pabandykite:

 <?php header("location:./");//redirect to index file header("location:index.php");//redirect to index file header("location:example.php"); ?> 
4
08 июня '17 в 9:34 2017-06-08 09:34 Atsakymą pateikė Bhargav Chudasama birželio 8 d. 17 d. 9:34 2017-06-08 09:34

Tai galime padaryti dviem būdais.

žemiau php kodo

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

Išsaugokite aukščiau nurodytą kodą https://bskud.com/PINCODE/BIHAR/index.php

2. Kai kuri nors sąlyga yra teisinga, nukreipkite į kitą puslapį.

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

"

3
04 янв. Atsakymą pateikė Kavita Sharma. 2018-01-04 10:30 '18, 10:30, 2018-01-04 10:30

Galite atnaujinti antraštę php: header

2
20 апр. Zack Marrapese atsakymas balandžio 20 d 2009-04-20 17:14 '09, 17:14, 2009-04-20 17:14

Yra keletas būdų, kaip tai padaryti, tačiau jei pageidaujate php , Id rekomenduoja naudoti funkcijų header() .

Iš esmės

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

Jei norite jį nuleisti ant nosies, tai geriausia jį naudoti funkcijose, todėl galite pridėti autentifikavimo ir kitus tikrinimo elementus.

Pabandykime patikrinti vartotojo lygį.

Taigi, tarkime, kad išsaugojote vartotojo institucijos lygį sesijoje, vadinamoje 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; } } . . . 

Tada skambinate kiekvienos svetainės, kurią norite atpažinti, funkcijai.

Kaip ir page.php arba kitame puslapyje.

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

Tikiuosi, kad rasite naudingą turinį.

Literatūra;

1
29 янв. Pyr James atsakymas sausio 29 d 2018-01-29 01:17 '18 at 1:17 2018-01-29 01:17
 <?php $url = "targetpage" Function redirect$url(){ If (headers_sent()) == false{ Echo '<script>window.location.href="' . $url . '";</script>'; }} ?> 
1
20 нояб. Joshua Charles Pickwell atsakymas lapkričio 20 d 2017-11-20 22:10 '17, 10:10 pm 2017-11-20 22:10

Jei norite peradresuoti, galite pabandyti naudoti „PHP“ antraštės funkciją. Norite nustatyti išvesties buferį, kad jūsų naršyklėje nebūtų rodomas peradresavimo įspėjimas.

 ob_start(); header("Location: ".$website); ob_end_flush(); 
1
15 нояб. atsakymą pateikė Doruk Ayar lapkričio 15 d. 2016-11-15 13:15 '16, 13:15 pm 2016-11-15 13:15

Jei naudojate „Apache“, peradresuoti taip pat galite .htaccess.

 Redirect 301 / http://new-site.com/ 
1
13 окт. atsakymas duotas jabko87 spalis 13 2017-10-13 13:56 '17 at 15:56 pm 2017-10-13 13:56

1. Naudodami „php“ funkciją, esančią kūrimo antraštėje

a) Paprastas nukreipimas be parametrų

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

b) Peradresuokite su GET parametrais

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

2. Peradresuokite iš javascript į php

a) Paprastas nukreipimas be parametrų

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

b) Peradresuokite su GET parametrais

 <?php $id = 2; echo "<script>location.href='index.php?id=$id redirect';</script>"; ?> 
0
03 авг. Shaan Ansari atsakymas 03 rugpjūtis 2018-08-03 16:26 '18, 16:26 pm 2018-08-03 16:26

Kiti klausimai apie „ žymių arba „ Klauskite“