使用标头位置时获取 HTTP ERROR 500

问题描述

所以我确实有一个网站托管在我自己的服务器 (UpCloud) 上,使用 Plesk。我也在使用 Cloudflare。 基本上我确实为我的网站为世界不同地区创建了多个目录(en/fr/de/etc...) 我的 index.PHP 中有一个这样的脚本,可以根据他们的国家自动重定向人们。

<?PHP
require 'IP2Location.PHP';

$loc = new IP2Location('databases/IP-COUNTRY.BIN',IP2Location::FILE_IO);
$record = $loc->lookup($_SERVER['REMOTE_ADDR'],IP2Location::ALL);

if($record == 'US') {
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: https://mywebsite.com/en');
    exit;
}
?>

问题是我收到了这个错误,即 500。无论我尝试过什么,它都不起作用。添加一些 .httaccess 代码添加一些我在互联网上为 Apache 和 Nginx 设置等找到的代码...

你们中的一些人是否遇到了同样的问题并解决了它?

先谢谢你!

编辑:使用

找到了一个可行的解决方
$country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];

解决方法

HTTP 301 重定向应设置为 header() 函数的第三个参数

<?php

error_reporting(E_ALL);
ini_set("display_errors",1);

require 'IP2Location.php';

$loc = new IP2Location('databases/IP-COUNTRY.BIN',IP2Location::FILE_IO);
$record = $loc->lookup($_SERVER['REMOTE_ADDR'],IP2Location::ALL);

if($record == 'US') {
    header('Location: https://mywebsite.com/en',true,301);
    exit;
}
,

终于找到了解决方案

$country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];
,

确保在调用 header() 之前没有生成任何输出。 检查 <?php 之前是否有空格/不可见字符。在 IP2Location.php 中也检查一下。

不确定这是否相关,但您可以尝试仅使用“Location”标头,而不是 HTTP 响应的第一行:

if($record == 'US') {
    header('Location: https://mywebsite.com/en');
    exit;
}

https://www.php.net/manual/en/function.header.php 它说它将使用 302 而不是您的 301:

第二个特殊情况是“Location:”标题。它不仅 将此标头发送回浏览器,但它也会返回一个 REDIRECT (302) 浏览器的状态码,除非 201 或 3xx 状态码 已经设置好了。

<?php
header("Location: http://www.example.com/"); /* Redirect browser */

/* Make sure that code below does not get executed when we redirect. */
exit;
?>