mod_rewrite 干扰 $_SERVER

mod_rewrite 干扰 $_SERVER

我有一个涉及 PHP 和 mod_rewrite 的问题。

我正在尝试加载该页面example.com/1

索引.php

<?php

// get requested uri
$uri = explode('/', strtolower(substr($_SERVER['REQUEST_URI'], 1)));

var_dump($uri[0]);

// route current page
if ($uri[0] == '1'){
    $page_id = '<br />1';
} else {
    header("HTTP/1.0 404 Not Found");
}

echo $page_id;

?>

var_dump 给出string(1) "1"并且回显的 page_id 是1

问题是我还收到以下警告。

PHP 警告:无法修改标头信息 - 标头已由(输出开始于 PATH:6)在第 12 行的 /PATH 中发送

第 6 行是 var_dump。

第 12 行是标题行。

由于该代码不应该运行,因此我不应该收到该警告。

.htaccess

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]

IndexIgnore *
Options -Indexes

example.com 虚拟主机

<VirtualHost *:80>
ServerName www.example.com
Redirect 301 / http://example.com/
</VirtualHost>

<VirtualHost *:80>

ServerName example.com

DocumentRoot PATH/example.com/public

LogLevel warn
ErrorLog  /var/log/apache2/example.com-error.log
CustomLog /var/log/apache2/example.com-access.log combined

</VirtualHost>

有些事我已尝试过。

当我删除该.htaccess文件并替换1index.php尝试访问时,example.com/index.php没有收到错误。

如果我手动设置,$uri[0] = '1';就不会收到警告。

如果我手动设置,$uri = '/1';就不会收到警告。

如果我向 中添加更多代码else {,例如将 设置$page_id为其他内容,它不会执行任何操作。似乎只有标题行被执行并产生警告。

看起来 mod_rewrite 以某种方式弄乱了$_SERVER变量。可能是某种编码问题,因为 var_dump 是正常的。

答案1

看起来更像是一个 PHP 错误。

如果脚本有任何输出,您就不能再执行 header() 函数。因此

echo 1; header(...)

将会失败,因为您已经将数字 1 发送回客户端。因此您的 var_dump 发送了一些输出,这导致 header() 函数失败。删除 var_dump。

相关内容