1547

Is it possible to redirect a user to a different page through the use of PHP?

Say the user goes to www.example.com/page.php and I want to redirect them to www.example.com/index.php, how would I do so without the use of a meta refresh? Is it possible?

This could even protect my pages from unauthorized users.

Paulo Boaventura
  • 1,365
  • 1
  • 9
  • 29
Sam
  • 18,417
  • 5
  • 22
  • 11
  • 17
    @Sam: just as side node, **do not** implement any kind of `protection from unauthorized users` via redirect; this is not how things should be done ;) – Strae May 27 '11 at 13:26
  • 10
    @Strae What's wrong with protecting pages with redirect ? Then what's the best way ? –  Aug 16 '13 at 03:06
  • 9
    @PravindaAmarathunga redirect is one of the elements, but not the only one. Just be sure that protected elements doesnt get outputted at all for unauthorized users; Browser's redirect can be disabled client-side, for example: if the browser doesnt do the redirect and the original page get outputted as normal, what would the user see? CMS usually do the redirect **and** doesnt print out protected items, replacing the normal output with a courtesy message. – Strae Aug 16 '13 at 22:23
  • 2
    @PravindaAmarathunga check the link from markus's answer: http://thedailywtf.com/Articles/WellIntentioned-Destruction.aspx – Strae Aug 16 '13 at 22:27
  • You can update the header in PHP: [header](http://us3.php.net/header) – Zack Marrapese Apr 20 '09 at 14:14
  • Problem solved - it should have been $options = array('http' => array('method'=>"GET", 'header' => array("Cookie: " . $_SERVER["HTTP_COOKIE"], "Authorization: Basic " . base64_encode("$username:$password")) ) ); – P Whittaker Jan 25 '22 at 10:46

35 Answers35

2040

Summary of existing answers plus my own two cents:

1. Basic answer

You can use the header() function to send a new HTTP header, but this must be sent to the browser before any HTML or text (so before the <!DOCTYPE ...> declaration, for example).

header('Location: '.$newURL);

2. Important details

die() or exit()

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

Why you should use die() or exit(): The Daily WTF

Absolute or relative URL

Since June 2014 both absolute and relative URLs can be used. See RFC 7231 which had replaced the old RFC 2616, where only absolute URLs were allowed.

Status Codes

PHP's "Location"-header still uses the HTTP 302-redirect code, this is a "temporary" redirect and may not be the one you should use. You should consider either 301 (permanent redirect) or 303 (other).

Note: W3C mentions that the 303-header is incompatible with "many pre-HTTP/1.1 user agents. Currently used browsers are all HTTP/1.1 user agents. This is not true for many other user agents like spiders and robots.

3. Documentation

HTTP Headers and the header() function in PHP

4. Alternatives

You may use the alternative method of http_redirect($url); which needs the PECL package pecl to be installed.

5. Helper Functions

This function doesn't incorporate the 303 status code:

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

    exit();
}

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

This is more flexible:

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

6. Workaround

As mentioned header() redirects only work before anything is written out. They usually fail if invoked inmidst HTML output. Then you might use a HTML header workaround (not very professional!) like:

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

Or a JavaScript redirect even.

window.location.replace("https://example.com/");
Jade Hamel
  • 1,360
  • 1
  • 15
  • 30
markus
  • 40,136
  • 23
  • 97
  • 142
  • 5
    Some problems with this answer: 303 may not be the "correct" status code. 301 may be desired for Google, for example. Secondly, `header('Location: '.$newURL);` must be before any HTML (or text) has been passed to the browser, or it will not work correctly. – Chuck Le Butt May 27 '11 at 12:30
  • 1
    Also, if the new URL is built by concatenating user input, some sanitization is in order. :) – MarioVilas Apr 27 '14 at 13:57
  • 7
    The daily WTF story is a common one, sadly. Anyway, it's not the missing die what cause the problem but a bad design. Shutting the process violently is wrong in 99.9% of the cases. A common, cleaner solution (not my favourite anyways) is to throw a RedirectionException and catch it on you application entry point. After that you can have all your "after *" calls (logs/close connections/what ever) – Roberto Decurnex Jul 17 '14 at 04:09
  • 4
    The `http-equiv="Location"` is not supported by all browsers. You should use `refresh` instead! `` – Timo002 Sep 23 '14 at 08:06
  • 103
    _Never_ issue a 301 unless you _mean it_. 301 means permanent, and permanent means _permanent_, meaning it will be cached by user agents, meaning long, caffeine-filled nights staring at application logs wondering if you're going insane because you swear some page should have been called or updated and you swear to God it works on your machine but not the client's. If you absolutely must call a 301, put a cache-control max-age on the resource. You don't have infinite wisdom and you shouldn't be acting like you do. – madumlao Dec 12 '14 at 09:47
  • 3
    But is there a reason to use die over exit? exit seems cleaner and more appropriate. – ars265 Mar 09 '15 at 18:21
  • A note about PECL: PECL 2.x does not include `http_redirect` for some reason, so betting on `http_redirect` might be a mistake in the long-run. – Christopher Schultz May 19 '15 at 17:59
  • commenter @tgape in the WTF story says "exit()" should be used instead of "die()": <> – Nick Humphrey May 22 '15 at 09:30
  • I'm wondering why all these codes are working fine in my localhost but failing when the system is up in a hosting site.. hmm.. – rhavendc Jun 20 '16 at 08:32
  • 6 solution is useful when need track redirects with client side tracking scripts, eg. google analytics. – dpa Nov 18 '16 at 12:56
  • 1
    +1 for the **Absolute URL** information - that was causing my redirect to fail silently on chrome (well, actually I was missing "http://", but that pointed me in that direction). – kris Dec 14 '16 at 06:54
  • 1
    don't forget to add header("Cache-Control: no-cache"); before the line – Mahdi Jazini Jan 03 '17 at 12:21
  • I combined the header solution & using the `die( "echo here" )` command to echo out meta refresh tag & all of the valid js solutions, should have me a pretty compatible little redirector! – RozzA Jul 07 '17 at 03:26
  • I keep reading that sending a header in the midst of html streaming out will generate the "cannot modify header" error, but I have not seen that in awhile now. I have even cookies accepted by a browser after html has started running into it. I just setup up codepen with 150 lines of html interrupted by a header sent by php. I can't find any notice if a problem either in the php error log or Chrome inspector. https://codepen.io/danallenhtn/pen/ooGWgd – DanAllen Nov 16 '17 at 01:43
  • 1
    @DanAllen you may have output buffering on; since it's not actually outputting the data to the client as the code runs, it hits the `header()` call and tacks that on before flushing the buffer to the client. – Doktor J Jun 01 '18 at 03:15
  • Since July 2014 relative URLs are allowed in Location header. See recent update in answer https://stackoverflow.com/a/25643550/1657819 (refer https://tools.ietf.org/html/rfc7231#section-7.1.2) – The Godfather Aug 13 '18 at 12:29
  • wtf??? the crawler can read php code??? I thought they read html and js... but if reads php means he is inside your server, that's not a crawler thats a virus and you have to worry a lot more than a "redirect"... I'm surprise none note this... – Ari Waisberg Aug 15 '18 at 14:19
  • I agree with @robertodecurnex. The problem with The Daily WTF story is that it uses redirection to prevent an unauthorized user from doing a deletion. That's an absolutely bad design. You should never rely on redirection to prevent anything. – Ehsan88 Apr 17 '19 at 03:21
  • 2
    If you are doing this in a framework, then `die()` or `exit()` is probably the last thing you should do. Check how you should exit cleanly from the framework so that it has a chance to log things, clean up, close files etc. Of course a framework will probably already have a helper function or method to do a redirect, but I'm mentioning this as it is good to not get into the habit of just doing an `exit()` without thinking about the consequences in the application. – Jason May 10 '19 at 09:31
  • is there any way to redirect before the browser detects the HTTP protocol? the reason i need to redirect is because i cannot get enough SSL certificates for all of my domains. i'd use `.htaccess` to redirect, but i need a way to somehow pass on which domain redirected to the final domain? – oldboy Aug 07 '19 at 01:00
155

Use the header() function to send an HTTP Location header:

header('Location: '.$newURL);

Contrary to what some think, die() has nothing to do with redirection. Use it only if you want to redirect instead of normal execution.

File example.php:

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

Result of three executions:

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

Resuming — obligatory die()/exit() is some urban legend that has nothing to do with actual PHP. It has nothing to do with client "respecting" the Location: header. Sending a header does not stop PHP execution, regardless of the client used.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
vartec
  • 131,205
  • 36
  • 218
  • 244
  • 8
    die() or exit() is for clients who don't respect the "Location: ..." header – clawr Apr 21 '09 at 00:59
  • 18
    @clawr: No, `exit()` is to prevent the page from showing up the remaining content (think restricted pages). vartec is right, it **has nothing to do with the HTTP Location header** and you don't need to `exit`. I chose to include it in my answer because, for someone who doesn't know how to do a *simple* redirect, one might as well play safe rather than not implement a simple yet crucial step just so he is able to take advantage of *advanced* process control. – Alix Axel Jun 05 '13 at 17:24
  • 2
    But browsers that respect the header will leave the page and close the connection while your script is still executing. This is totally bad. PHP will go on with the script for some time (that's why your code executes) but may abort it randomly in the middle of execution, leaving stuff broken. Calling ignore_user_abort() will prevent this, but sincerely I it's not worth it. Just go on with your HTML writing stuff (though probably useless) but don't do stuff that writes on disk or database after a header('Location:'); Write to disk before the redirect if possible. [Also: url should be absolute.] – FrancescoMM Mar 21 '17 at 17:45
  • is there any way to redirect before the browser detects the HTTP protocol? the reason i need to redirect is because i cannot get enough SSL certificates for all of my domains. i'd use `.htaccess` to redirect, but i need a way to somehow pass on which domain redirected to the final domain? – oldboy Aug 07 '19 at 00:53
125
function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
        header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

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

Don't forget to die() / exit() !

Rifky Niyas
  • 1,737
  • 10
  • 25
Alix Axel
  • 151,645
  • 95
  • 393
  • 500
  • 6
    And don't forget output buffering or you'll end up with 'Headers already sent'. – Kuroki Kaze Apr 20 '09 at 14:36
  • 8
    ... and dont forget th print out somthign like "you'll be redirected to $nepage in $n seconds, click $link here if redirect dont happen" Some broser, and some browser's settings, may fail that redirect. – Strae Apr 20 '09 at 15:49
  • 4
    @DaNieL: this type of redirect won't take "$n seconds". It will be instant if it happens at all, and any conforming browser should handle it. I think you're thinking of the "meta refresh" redirects that people use when they don't know any better. – rmeador Apr 20 '09 at 16:03
  • 1
    @rmeador... For older browsers and speciality browsers. You should first do your Location header, if fails have a meta-redirect with the "you'll be redirected to page in x seconds" with a link in case the meta-redirect fails. That's the proper and fail-safe way of doing a redirect. – Andrew Moore Apr 20 '09 at 20:48
  • 3
    Andrew: how can HTTP browser not respect Location:? – vartec Apr 21 '09 at 07:56
  • does not incorporate the 303 status. – markus Apr 21 '09 at 12:37
  • 1
    @Kuroki Kaze: You won't end up with 'Headers already sent' because of the headers_sent() check. – Alix Axel Aug 13 '09 at 06:54
  • @vartec It doesn't have to be a browser, it could be a spider or a malicious user. – MarioVilas Apr 27 '14 at 13:57
  • @MarioVilas why is a spider or a malicious user a problem? If the intention is to lead a visitor away from a confidential part of the site, then the app's design is quite flawed already... – MauganRa Nov 13 '16 at 15:25
  • why do we need the exit() or die()? – Tanner Summers Nov 20 '16 at 03:28
  • @TannerSummers: so no more processing is done on PHP and no content is displayed to the user. The former is potentially harmful (deleting records, etc) and hard to debug – MestreLion Aug 04 '18 at 08:42
113

Output JavaScript from PHP using echo, which will do the job.

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

You can't really do it in PHP unless you buffer the page output and then later check for redirect condition. That might be too much of a hassle. Remember that headers are the first thing that is sent from the page. Most of the redirect is usually required later in the page. For that you have to buffer all the output of the page and check for redirect condition later. At that point you can either redirect page user header() or simply echo the buffered output.

For more about buffering (advantages)

What is output buffering?

Community
  • 1
  • 1
TheTechGuy
  • 16,560
  • 16
  • 115
  • 136
  • 3
    Simple and to the point answer! Great for a simple page redirection! – Stathis Andronikos May 19 '16 at 11:04
  • And that way you do not run into the common `Cannot modify header information - headers already sent by` error. – Avatar Aug 28 '16 at 18:33
  • 1
    @hmd, what if javascript is disabled ? – Istiaque Ahmed Sep 09 '17 at 21:20
  • @IstiaqueAhmed javascript is almost always enabled these days but if it it is disabled then you can use PHP buffer. [This SO question](https://stackoverflow.com/questions/2832010/what-is-output-buffering) answers that. If you are using PHP Buffering then you dont need this method I gueess. – TheTechGuy Sep 10 '17 at 17:55
  • 4
    False, you can (and should) do it in PHP even without buffering: in a well-designed page all relevant PHP processing should take place before any HTML content is sent to the user. That way PHP redirects will work fine. – MestreLion Aug 04 '18 at 08:45
  • 3
    javascript is not automatically activated, in fact this only holds true for modern browsers. also, the question was about php, not JS – clockw0rk Jun 04 '20 at 13:41
  • 1
    Yeah this is an answer to a completely different question. You have no control over the client side, and it's dangerous to assume you do. – miken32 Dec 08 '20 at 15:58
113

1. Without header

here you will not face any problem

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

2. Using header function with exit()

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

but if you use header function then some times you will get "warning like header already send" to resolve that do not echo or print before sending headers or you can simply use die() or exit() after header function.

3. Using header function with ob_start() and 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
?>
Juned Ansari
  • 5,035
  • 7
  • 56
  • 89
58

Most of these answers are forgetting a very important step!

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

Leaving that vital second line out might see you end up on The Daily WTF. The problem is that browsers do not have to respect the headers which your page return, so with headers being ignored, the rest of the page will be executed without a redirect.

nickf
  • 537,072
  • 198
  • 649
  • 721
  • 1
    What's about give some output to the user before kill the script? You know, people love to know what is happenin... – Strae Apr 20 '09 at 15:50
  • 3
    you're assuming that the script has nothing to do except redirect. Which might be not true at all. – vartec Apr 20 '09 at 17:11
  • 15
    @DaNieL: change it to die("Stop ignoring my headers!") – nickf Apr 21 '09 at 00:56
  • 3
    I liked that simple explanation of `die();` you gave - if you dont do it the user may see the complete page for a moment if you do use it; the user will be redirected and no temporary content glitch will show + 1 – TheBlackBenzKid Jun 02 '15 at 05:46
  • It is possible to have useful activity occur after the header is sent, activity that sends nothing to the browser, but logs the activity or finishes recording transactions. For this reason, the need for die/exit is depends on the script. – DanAllen Nov 16 '17 at 01:03
  • For the record, that article is nonsense. The problem there was design that used GET requests to effect a change on the server, which is a HUGE no-no. – miken32 Dec 08 '20 at 16:01
35

Use:

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

Or if you've already opened PHP tags, use this:

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

You can also redirect to external pages, e.g.:

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

Make sure you include exit() or include die().

Dirk Diggler
  • 863
  • 1
  • 10
  • 22
jake
  • 830
  • 9
  • 10
  • it works only as the first statement in code. If you have logic and redirect is based on that. use meta http-equiv refresh or window.open javascript than. (copied) – MindRoasterMir Mar 19 '21 at 22:35
  • It doesn't have to be the first statement in the code. It just has to before any output. Organise your code to do all logic before it starts printing output - then probably it should print the prepared output all in one go. – bdsl May 30 '21 at 13:15
26

You can use session variables to control access to pages and authorize valid users as well:

<?php
    session_start();

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

    // Page goes here
?>

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

Recently, I got cyber attacks and decided, I needed to know the users trying to access the Admin Panel or reserved part of the web Application.

So, I added a log access for the IP address and user sessions in a text file, because I don't want to bother my database.

Asuquo12
  • 827
  • 17
  • 26
21

Many of these answers are correct, but they assume you have an absolute URL, which may not be the case. If you want to use a relative URL and generate the rest, then you can do something like this...

$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
Luke
  • 18,811
  • 16
  • 99
  • 115
20

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

Daniel A. White
  • 187,200
  • 47
  • 362
  • 445
  • is there any way to redirect before the browser detects the HTTP protocol? the reason i need to redirect is because i cannot get enough SSL certificates for all of my domains. i'd use `.htaccess` to redirect, but i need a way to somehow pass on which domain redirected to the final domain? – oldboy Aug 07 '19 at 00:53
19

Use the following code:

header("Location: /index.php");
exit(0);   
Star
  • 3,222
  • 5
  • 32
  • 48
joan16v
  • 5,055
  • 4
  • 49
  • 49
15

I've already answered this question, but I'll do it again since in the meanwhile I've learnt that there are special cases if you're running in CLI (redirects cannot happen and thus shouldn't exit()) or if your webserver is running PHP as a (F)CGI (it needs a previously set Status header to properly redirect).

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

I've also handled the issue of supporting the different HTTP redirection codes (301, 302, 303 and 307), as it was addressed in the comments of my previous answer. Here are the descriptions:

  • 301 - Moved Permanently
  • 302 - Found
  • 303 - See Other
  • 307 - Temporary Redirect (HTTP/1.1)
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Alix Axel
  • 151,645
  • 95
  • 393
  • 500
13

To redirect the visitor to another page (particularly useful in a conditional loop), simply use the following code:

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

In this case, mypage.php is the address of the page to which you would like to redirect the visitors. This address can be absolute and may also include the parameters in this format: mypage.php?param1=val1&m2=val2)

Relative/Absolute Path

When dealing with relative or absolute paths, it is ideal to choose an absolute path from the root of the server (DOCUMENT_ROOT). Use the following format:

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

If ever the target page is on another server, you include the full URL:

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

HTTP Headers

According to HTTP protocol, HTTP headers must be sent before any type of content. This means that no characters should ever be sent before the header — not even an empty space!

Temporary/Permanent Redirections

By default, the type of redirection presented above is a temporary one. This means that search engines, such as Google Search, will not take the redirection into account when indexing.

If you would like to notify search engines that a page has been permanently moved to another location, use the following code:

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

For example, this page has the following code:

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

When you click on the link above, you are automatically redirected to this page. Moreover, it is a permanent redirection (Status: 301 Moved Permanently). So, if you type the first URL into Google, you will automatically be redirected to the second, redirected link.

Interpretation of PHP Code

The PHP code located after the header() will be interpreted by the server, even if the visitor moves to the address specified in the redirection. In most cases, this means that you need a method to follow the header() function of the exit() function in order to decrease the load of the server:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
Star
  • 3,222
  • 5
  • 32
  • 48
  • Why `¶` (near the end of the second paragraph)? Do you mean `&para` instead (so the whole reads `mypage.php?param1=val1&param2=val2)`)? (The HTML entity [para](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML)) is "¶" - perhaps some external program did a conversion?). – Peter Mortensen Feb 18 '19 at 09:25
11
header("Location: https://www.example.com/redirect.php");

Direct redirect to this link https://www.example.com/redirect.php

$redirect = "https://www.example.com/redirect.php";
header("Location: $redirect");

First get $redirect value and than redirect to [value] like: https://www.example.com/redirect.php

CodAIK
  • 715
  • 7
  • 7
10

Yes, it's possible to use PHP. We will redirect to another page.

Try following code:

<?php
    header("Location:./"); // Redirect to index file
    header("Location:index.php"); // Redirect to index file
    header("Location:example.php");
?>
Jsowa
  • 9,104
  • 5
  • 56
  • 60
10

Use:

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

This is a regular and normal PHP redirect, but you can make a redirecting page with a few seconds wait by the below code:

<?php
    header('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.
?>
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Obaidul Haque
  • 916
  • 11
  • 18
9

To redirect in PHP use:

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

Kevin M. Mansour
  • 2,915
  • 6
  • 18
  • 35
9

In the eve of the semantic web, correctness is something to consider. Unfortunately, PHP's "Location"-header still uses the HTTP 302-redirect code, which, strictly, isn't the best one for redirection. The one it should use instead, is the 303 one.

W3C is kind enough to mention that the 303-header is incompatible with "many pre-HTTP/1.1 user agents," which would amount to no browser in current use. So, the 302 is a relic, which shouldn't be used.

...or you could just ignore it, as everyone else...

Henrik Paul
  • 66,919
  • 31
  • 85
  • 96
7

You can use some JavaScript methods like below

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

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Vikram Pote
  • 5,433
  • 4
  • 33
  • 37
7

Yes, you can use the header() function,

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

And also best practice is to call the exit() function right after the header() function to avoid the below code execution.

According to the documentation, header() must be called before any actual output is sent.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Casper
  • 1,469
  • 10
  • 19
6

Here are my thoughts:

IMHO, the best way to redirect an incoming request would be by using location headers, which goes

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

Once this statement is executed, and output sent out, the browser will begin re-directing the user. However, ensure that there hasn't been any output (any echo / var_dump) before sending headers, else it will lead to errors.

Although this is a quick-and-dirty way to achieve what was originally asked, it would eventually turn out to be an SEO disaster, as this kind of redirect is always interpreted as a 301 / 302 redirect, hence search engines will always see your index page as a re-directed page, and not something of a landing page / main page.

Hence it will affect the SEO settings of the website.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • 1
    exit() should be used immediately after the header() – EKanadily Feb 17 '17 at 07:05
  • @docesam .. agreed .. exit() should be immediately called after header() call. However I feel, if there is no more output to browser after this header() statement, exit() may not be necessary - Just my opinion – Bhaskar Pramanik Feb 20 '17 at 04:23
  • yes but you have to explain that because someone could copy your line of code to his script and that can potentially cause long times of circling around himself figuring out what went wrong. – EKanadily Feb 21 '17 at 02:47
  • 1
    @BhaskarPramanik imagine you have to lock a door quickly, but then you have to pull/push/smash them again to make sure if it already locked or not.. – aswzen Mar 22 '18 at 03:40
6

Like others here said, sending the location header with:

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

but you need to do it before you've sent any other output to the browser.

Also, if you're going to use this to block un-authenticated users from certain pages, like you mentioned, keep in mind that some user agents will ignore this and continue on the current page anyway, so you'll need to die() after you send it.

Brent
  • 501
  • 3
  • 13
  • `but you need to do it before you've sent any other output to the browser.` Awesome!! Been searching for minutes on why I kept receiving the headers already sent error. +1!! – josh Jan 18 '14 at 08:39
  • More general, you have /stop your script completely/. `die()` is just one way to do that. – MauganRa Nov 13 '16 at 15:29
5

The best way to redirect with PHP is the following code...

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

Make sure no code will work after

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

All the code must be executed before the above line.

Suppose,

Case 1:

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

It will redirect properly to the location (index.php).

Case 2:

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

The above code will not redirect to the location (index.php).

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
sabuz
  • 829
  • 8
  • 10
5

You can try using

header('Location:'.$your_url)

for more info you can refer php official documentation

Roman
  • 2,530
  • 2
  • 27
  • 50
Nimal V
  • 166
  • 1
  • 4
4

We can do it in two ways:

  1. When the user comes on https://bskud.com/PINCODE/BIHAR/index.php then redirect to https://bskud.com/PINCODE/BIHAR.php

    By the below PHP code

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

    Save the above code in https://bskud.com/PINCODE/BIHAR/index.php

  2. When any condition is true then redirect to another page:

    <?php
        $myVar = "bskud";
        if ($myVar == "bskud") {
    ?>
    
    <script> window.location.href="https://bskud.com";  </script>
    
    <?php
        }
        else {
            echo "<b>Check the website name again</b>";
        }
    ?>
    
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • What is this? Please don't use links to your own website. And the second example uses javascript redirect, and not the PHP `header()` function. – Scriptman Jan 18 '18 at 09:51
4

1. Using header, a built-in PHP function

a) Simple redirect without parameters

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

b) Redirect with GET parameters

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

2. Redirect with JavaScript in PHP

a) Simple redirect without parameters

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

b) Redirect with GET parameters

<?php
     $id = 2;
     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
   ?>
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Shaan Ansari
  • 510
  • 6
  • 10
  • The javascript bit somehow was the only thing that was working in the final hosting of the site; I believe it's a matter of caching but with that I solved it right away. – cdsaenz Apr 28 '20 at 01:49
4

Using header function for routing

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

Suppose we want to route from A.php file to B.php than we have to take help of <button> or <a>. Lets see an example

<?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>
Jsowa
  • 9,104
  • 5
  • 56
  • 60
Mehedi Abdullah
  • 772
  • 10
  • 13
  • There are already plenty of solutions. Your solution has mixed HTML and PHP without PHP tags. Secondly you send header after printing html code, so it will not work. And name of example files are bad. You shouldn't named them A.php and B.php. I know that is only example, but still you should care about naming convention. – Jsowa May 07 '20 at 13:41
3

There are multiple approaches to achieve what you are looking for.

One common way is by setting Header Location:

header("Location: www.example.com/index.php");

exit();
Faizan Noor
  • 846
  • 10
  • 11
  • 2
    You wrote header("Location : www.example.com/index.php") instead of header("Location: www.example.com/index.php"); The space between Location and : causes a 500 internal server error – dev-chicco Mar 31 '23 at 16:58
2

Use:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • 1
    Could you explain the function of your code? Your answer was flagged because of its length and content. – www139 Nov 20 '17 at 19:38
2

There are multiple ways of doing this, but if you’d prefer php, I’d recommend the use of the header() function.

Basically

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

If you want to kick it up a notch, it’s best to use it in functions. That way, you are able to add authentications and other checking elemnts in it.

Let’s try with by checking the user’s level.

So, suppose you have stored the user’s authority level in a session called u_auth.

In the 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;
        }
     }

     . . .

You’ll then call the function for every page that you want to authenticate.

Like in page.php or any other page.

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

    . . .

References;

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Pyr James
  • 711
  • 1
  • 6
  • 10
2

I like the kind of redirection after counting seconds

<?php

header("Refresh: 3;url=https://theweek.com.br/índex.php");
Paulo Boaventura
  • 1,365
  • 1
  • 9
  • 29
2

You can use the header() function in PHP to perform a redirect to another page. The header() function sends a raw HTTP header to the browser, which can be used to redirect the user to a new page. Here's an example:

<?php
// Redirect to a new page
header("Location: https://www.example.com/newpage.php");
exit;
?>

In this example, the header() function sends a "Location" header with the URL of the new page to which the user will be redirected. The exit statement is used to immediately end the current script execution and prevent any further output.

1

try this one

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
Shareque
  • 129
  • 1
  • 9
0

You can attempt to use the PHP header function to do the redirect. You will want to set the output buffer so your browser doesn't throw a redirect warning to the screen.

ob_start();
header("Location: " . $website);
ob_end_flush();
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Doruk Ayar
  • 334
  • 1
  • 4
  • 17
  • 1
    exit() should be used immediately after the header() . also out buffering has been automatically on by default for some time now. – EKanadily Feb 17 '17 at 07:07
0

If you're running on Apache you can also use .htaccess for redirect.

Redirect 301 / http://new-site.com/
michal.jakubeczy
  • 8,221
  • 1
  • 59
  • 63