I already have a question with this issue but a further question belonging $_GET and header-function:
I have a multilingual site. When calling a page that does not exist, .htaccess will refer to 404.php in the root directory.
The .htaccess looks like this:
ErrorDocument 404 /404.php
That 404.php in the root direction simply looks at which default language is set by a SESSION or COOKIE and refers to the language subdirectory /language/404.php
The root 404.php looks like that:
include_once "scripts/pref_language.php";
if (isset ($_GET['uri']) ){
$get = $_GET['uri'];
header("Location: /$pref_language/404.php?uri=$get");
exit;
}
$url = urlencode($_SERVER['REQUEST_URI']);
header("Location: /$pref_language/404.php?uri=$url");
Refered to the language subdirectory, the posted URL looks like this where the parameter uri is still different:
http://www.example.com/english/404.php?uri=somedata
or with another language:
http://www.example.com/german/404.php?uri=somedata
The code of /english/404.php looks like this:
<?php
error_reporting(E_ALL);
ob_start();
session_start();
header ("Content-Type: text/html; charset=utf-8");
include_once "../scripts/db_connect.php";
include_once "../scripts/functions.php";
include_once "../scripts/browser_identification.php";
include_once "../scripts/pref_language.php";
...some text variables in its specific language
include_once "../templates/template_404.php";
?>
The template is just some HTML styling. The Footer that will be included in the template_404.php is the main attraction to send data. In that Footer there is the option to change the language setting and switching between the language paths. If a form will be submitted the SESSION and COOKIE will be changed and the page starts a header-function.
So here is the Code from the Footer:
if (isset($_GET['uri']) ) {
$uri = urlencode($_GET['uri']);
echo "TEST URI: $uri";
}
...
$basename = basename($_SERVER['SCRIPT_NAME'], ".php");
if ($basename === "index") {
$form_action = rtrim($_SERVER['PHP_SELF'], 'index.php');
} else{
$form_action = htmlentities($_SERVER['PHP_SELF']);
}
...
if ( isset($_POST['pref_lang']) ) {
$content = $_POST['pref_lang'];
if ($content === "german") {
if ($basename === "about") {
$basename = "info";
} else if ($basename === "contact") {
$basename = "kontakt";
}
}
$_SESSION['pref_language'] = $_POST['pref_lang'];
setcookie('pref_language', '', time()- 999999, '/', '.example.de' );
setcookie('pref_language', $content, time()+60*60*24*365, '/', '.example.de');
if ($basename === "404"){
header("Location: ../$content/404.php?uri=$uri");
} else {
header("Location: ../$content/$basename");
}
}
?>
<div id="data">
<fieldset>
<ul>
<li>
<form action="<?php echo $form_action;?>" method="post">
<input type="submit" id="german" name="pref_lang" value="german"/><label for="german">german</label>
</form>
</li>
</ul>
</fieldset>
</div>
The problem is that when a page has the URL of
http://www.example.com/**english**/404.php?uri=somedata
and I will submit $_POST to change the language to german like:
http://www.example.com/**german**/404.php?uri=somedata
for example $_GET['uri'] will be empty and the URL looks like:
http://www.example.com/**german**/404.php?uri=
after starting header function. Instead of header I tried to echo out that line and I will receive a message that uri is not defined.
Undefined variable: uri in /customers/7/4/1/example.com/httpd.www/scripts/footer_en.php on line 102
Location: ../english/404.php?uri=
The strange about that is that when I will call the page before sending $_POST and have a look at the source code of the site the variable $uri will read out the $_GET parameter correctly but later on it does not work anymore in the header function. The question is why does that not work in that?
So it would be nice if someone can tell me what to do to fetch this issue. I really would appreciate.
Thanks alot.
UPDATE:
I tried to save the $_GET parameter into a SESSION but when posting the form and getting redirected to the other language site the content of the SESSION seems to be wrong because it will not be the $_GET parameter instead of that it will be something what comes from a css link from the html head like css/colorbox.css
At the moment I try to fetch this by setting the form action to that:
...
if ($basename === "index") {
$form_action = rtrim($_SERVER['PHP_SELF'], 'index.php');
}
if ($basename === "404") {
$form_action = "";
}
if ($basename !== "index" AND $basename !== "404") {
$form_action = htmlentities($_SERVER['PHP_SELF']);
}
...
<li>
<form action="<?php echo $form_action. ( (isset($_GET['uri']) ) ? "/english/?uri=".urlencode($_GET['uri']) : "" );?>" method="post">
<input type="submit" id="english" name="pref_lang" value="en"/><label for="en">englisch</label>
</form>
</li>
The root cause of this error is that php redirect header must be send before anything else. This means any space or characters sent to browser before the headers will result in this error. Like following example, there should not be any output of even a space before the headers are sent.
The header() function in PHP sends a raw HTTP header to a client or browser. Before HTML, XML, JSON, or other output is given to a browser or client, the server sends raw data as header information with the request (particularly HTTP Request).
If I'm understanding this correctly, you want to go from:
http://www.example.com/**english**/404.php?uri=somedata
To:
http://www.example.com/**german**/404.php?uri=somedata
Using a form submit button. To do this you would set the action on the tag to include the uri from the current page so that it's passed to the new language 404 page.
<form action="<?php echo $form_action . ((isset($_GET['uri']))?$_GET['uri']:""); ?>" method="post">
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With