PHP, URI-маршрутизация, оператор switch и заголовки - PullRequest
2 голосов
/ 06 апреля 2011

Я пытаюсь заставить работать систему маршрутизации 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

Я не понимаю, почему он пытается запустить случай по умолчанию, когда переменная $ page_url определяется путем анализа запрошенного URI, но этого не происходит, если она установлена ​​вручную, поскольку в обоих случаях var_dump выдает одно и то же.

Кроме того, если я добавлю echo'default'; к регистру по умолчанию, он не будет выводиться, но я все равно получу предупреждение в журнале. Это не имеет смысла для меня.

Спасибо за вашу помощь.

Редактировать

Следует отметить, что, если я добавлю echo'services'; к делу, он будет выведен. Я все еще получаю предупреждение в заголовке, хотя. Как будто break; не регистрируется. Но это потому, что он также не отражает "default".

Ответы [ 4 ]

0 голосов
/ 11 апреля 2011

Разобрался с проблемой. Браузер пытался загрузить favicon.ico, который был перенаправлен на страницу маршрутизации index.php. Поскольку favicon.ico не является маршрутом, он запустил вариант по умолчанию для favicon.ico и правильный вариант для фактической загрузки страницы.

0 голосов
/ 06 апреля 2011

И вы повторили запрос $ uri [1], чтобы убедиться, что он установлен на 'services'?

0 голосов
/ 06 апреля 2011

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 собирается отправить этот текст, он должен отправить заголовки, а затем BODY с выводом var_dump.

Позже вы пытаетесь отправить еще один заголовок!

Уже слишком поздно !!!

Заголовки уже удалены, были переварены браузером, и он поглощает ваш основной текст HTML.

Опция: - Включить output_buffering в php.ini - использовать http://php.net/ob_start - изменить var_dump () на error_log (print_r ($ чем угодно, 1)); и хвост вашего apache error_log

Первые два имеют последствия, которые меня не волнуют, но это ваш сайт.

Последнее означает, что вы увидите другие сообщения об ошибках, которые, возможно, уже отсутствуют, так же, как и BEST imho.

0 голосов
/ 06 апреля 2011

Я предполагаю, что там есть некоторые пробелы. Что strlen говорит о $ uri [1]? Я думаю, это не 8.

...