我正在尝试使用PHP URI路由系统。
$page_url = 'services';
行被评论时,我收到以下错误。
PHP Warning: Cannot modify header information - headers already sent by (output started at PATH:12) in PATH on line 22
第12行是var_dump,第22行是404标题。
如果我取消注释$page_url = 'services';
我没有收到错误。
注释或取消注释,var_dump输出相同的东西:string(8)“services”。
我正在加载的页面是http://testwebsite.com/fr/services
以下是index.php
代码。
<?php
// get requested uri
$uri = explode('/', strtolower(substr($_SERVER['REQUEST_URI'], 1)));
//set variables
$lang = $uri[0];
$page_url = $uri[1];
//debug
$page_url = 'services';
var_dump($page_url);
// route current page
switch($page_url){
case 'services':
$page_id = 'services';
break;
default:
header("HTTP/1.0 404 Not Found");
break;
}
?>
以下是.htaccess
文件。
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/index.php
RewriteRule .* /index.php
AddDefaultCharset UTF-8
IndexIgnore *
Options -Indexes
我不明白为什么当通过解析所请求的URI来确定$ page_url变量时它会尝试运行默认情况,但是如果它是手动设置则不会,因为在这两种情况下var_dump都输出完全相同的东西。 / p>
此外,如果我将echo'default';
添加到默认情况,它不会输出它,但我仍然在日志中收到警告。这对我没用。
感谢您的帮助。
修改
应该注意的是,如果我将echo'services';
添加到服务案例中,它就会被输出。我仍然在标题上收到警告。好像break;
没有注册。但这是因为它也不会回应“默认”。
答案 0 :(得分:0)
我的猜测是那里有一些尾随的空白。 strlen
对$ uri [1]的评价是什么?我猜它不是8。
答案 1 :(得分:0)
你已经回应了'uri [1],以确保它被设置为'服务'?
答案 2 :(得分:0)
HTTP响应有两个部分,标题和正文:
----
200 - OK
Content-type: text/html
Content-length: 42
Header: blah blah blah
Header: blah blah blah
Header: blah blah blah
Header: blah blah blah
This is your HTML content page here!
看到两条分隔的空白行?专注于它。禅在它上面。这就是标题“完成”的“触发器”,这就是正文。
var_dump将文本作为文本发送到浏览器。
如果PHP要发送该文本,则必须发送标题,然后发送带有var_dump输出的BODY。
稍后,您尝试发送另一个标题!
太晚了!!!
标题已经消失,被浏览器消化,并且正在耗尽HTML正文。
选项: - 在php.ini中打开output_buffering - 使用http://php.net/ob_start - 将var_dump()更改为error_log(print_r($ whatever,1));和你的apache error_log
前两个有我不关心的后果,但它是你的网站。
最后一个意味着你会看到你可能已经遗漏的其他错误消息,所以最好的imho。
答案 3 :(得分:0)
找出问题所在。浏览器正在尝试加载被重定向到index.php路由页面的favicon.ico。由于favicon.ico不是路由,因此它运行了favicon.ico的默认大小写,以及实际页面加载的右侧大小。