我有一个涉及 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
文件并替换1
并index.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。