Назад | Перейти на главную страницу

mod_rewrite мешает $ _SERVER ['REQUEST_URI']

У меня проблема с PHP и mod_rewrite.

Я пытаюсь загрузить страницу example.com/1.

index.php

<?php

// get requested uri
$uri = explode('/', strtolower(substr($_SERVER['REQUEST_URI'], 1)));

var_dump($uri[0]);

// route current page
if ($uri[0] == '1'){
    $page_id = '<br />1';
} else {
    header("HTTP/1.0 404 Not Found");
}

echo $page_id;

?>

Var_dump выдает string(1) "1" и отображаемый page_id равен 1.

Проблема в том, что я также получаю следующее предупреждение.

Предупреждение PHP: невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начался с PATH: 6) в / PATH в строке 12

Строка 6 - это var_dump.

Строка 12 - это строка заголовка.

Я не должен получать это предупреждение, поскольку этот код не должен запускаться.

.htaccess

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]

IndexIgnore *
Options -Indexes

виртуальный хост example.com

<VirtualHost *:80>
ServerName www.example.com
Redirect 301 / http://example.com/
</VirtualHost>

<VirtualHost *:80>

ServerName example.com

DocumentRoot PATH/example.com/public

LogLevel warn
ErrorLog  /var/log/apache2/example.com-error.log
CustomLog /var/log/apache2/example.com-access.log combined

</VirtualHost>

Кое-что пробовал.

Когда я удаляю .htaccess файл и заменить 1 по index.php и попробуйте получить доступ example.com/index.php Я не получаю сообщения об ошибке.

Если я установлю $uri[0] = '1'; вручную я не получаю предупреждения.

Если я установлю $uri = '/1'; вручную я не получаю предупреждения.

Если я добавлю еще код в else {, как установить $page_id к чему-то другому, он ничего не делает. Кажется, что выполняются только строки заголовка и выдают предупреждение.

Похоже, что mod_rewrite каким-то образом портит $_SERVER переменная. Может быть, какая-то проблема с кодировкой, так как var_dump в норме.

Кажется, ошибка PHP больше, чем что-либо еще.

Если есть ЛЮБОЙ вывод сценария, вы больше НЕ МОЖЕТЕ выполнять функцию header (). Так

echo 1; header(...)

Не удастся, потому что вы уже отправили номер 1 клиенту. Итак, ваш var_dump отправляет некоторый вывод, и это приводит к сбою функции header (). Удалите файл var_dump.