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

.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 в норме.

1
задан 2 March 2017 в 02:27
1 ответ

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

Если существует вывод из сценария, Вы НЕ можете сделать заголовка () функция больше. Так

echo 1; header(...)

Перестанет работать, потому что Вы уже передали номер 1 обратно клиенту. Таким образом, Ваш var_dump отправляет некоторый вывод, и это заставляет заголовок () функция перестать работать. Удалите var_dump.

0
ответ дан 4 December 2019 в 10:27

Теги

Похожие вопросы