PHP,URI路由,switch语句和头文件

时间:2011-04-06 17:28:15

标签: php routing header switch-statement

我正在尝试使用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;没有注册。但这是因为它也不会回应“默认”。

4 个答案:

答案 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的默认大小写,以及实际页面加载的右侧大小。