我试图得到一个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输出相同的内容:"服务"
。我正在加载的页面是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
我不明白为什么它试图运行默认情况下,当$page_url变量是通过解析请求的URI确定,但不如果它是手动设置,因为在这两种情况下,var_dump输出完全相同的东西。
此外,如果我将echo'default';
添加到默认情况下,它不会输出它,但我仍然在日志中得到警告。这对我来说没有意义。
谢谢你的帮助。
编辑
应该注意的是,如果我将echo'services';
添加到服务案例中,它将被输出。我仍然得到一个警告的标题。好像break;
没有注册。但是它也不回显"default"
我猜那里有一些尾随空格。strlen
对$uri[1]说了什么?我猜不是8。
并且您已经回显了$uri[1]以确保它被设置为'services'?
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
前两个结果我不在乎,但这是你的网站。
最后一个意味着您将看到您可能已经错过的其他错误消息,所以是最好的。
找到问题了。浏览器试图加载favicon.ico,该页面被重定向到index.php路由页面。因为favicon.ico不是一个路由,所以它运行favicon.ico的默认情况和实际页面加载的正确情况。