У меня проблема с использованием PHP и mod_rewrite.
Я пытаюсь загрузить страницу example.com/1
.
<?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 - строка заголовка.
Я не должен получать это предупреждение, поскольку этот код не должен запускаться.
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]
IndexIgnore *
Options -Indexes
<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 больше, чем что-либо еще.
Если существует вывод из сценария, Вы НЕ можете сделать заголовка () функция больше. Так
echo 1; header(...)
Перестанет работать, потому что Вы уже передали номер 1 обратно клиенту. Таким образом, Ваш var_dump отправляет некоторый вывод, и это заставляет заголовок () функция перестать работать. Удалите var_dump.