PHP, URI路由,开关语句和头



我试图得到一个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的默认情况和实际页面加载的正确情况。

最新更新