mod_rewrite干扰$ _SERVER

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

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

的index.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警告:无法修改标题信息 – 在第12行的/ PATH中已经由(path:6处开始的输出)发送的标题

第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文件,并通过index.phpreplace1 ,并尝试访问example.com/index.php我没有得到错误。

如果我设置$uri[0] = '1'; 手动我没有得到警告。

如果我设置$uri = '/1'; 手动我没有得到警告。

如果我把更多的代码添加到else { ,比如将$page_id设置为别的东西,它什么也不做。 似乎只有标题行被执行并产生警告。

看起来像mod_rewrite是搞乱了$_SERVERvariables。 也许某种编码问题,因为var_dump是正常的。

似乎PHP错误比任何其他更多。

如果脚本中有任何输出,则不能再执行header()函数。 所以

echo 1; header(...)

将会失败,因为您已经将号码1发送回客户端。 所以你var_dump发送一些输出,这导致header()函数失败。 删除var_dump。