Бложек теперь на old.mrThe.name. Следите за обновлениями.

Неожиданная проблема возникла при переезде на другой хостинг.
WordPress после включения ЧПУ(permalinks) показывал только 404-ю ошибку, причём, даже на главной.

За неделю были выкурены все конфиги апача и php, но решение найдено не было и пришлось шаг за шагом разбирать что же там делает вордпресс, и почему отдаёт ошибку.

.

В итоге, зацепился за то, что параметры home и siteurl после установки нового вордпресса выглядят так: “http://site.ruhttp://site.ru”, когда должны быть “http://site.ru”.

.

Ещё немого поисков, и оказывается, что за формирование этого параметра отвечает функция “wp_guess_url()“, которая находится в файле “wp-includes/functions.php“.

.

Самая интересная строка в ней:

$url = preg_replace('|/wp-admin/.*|i', '', $schema . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);

Собственно, всё отлично и должно работать. Но посмотрев что возвращает каждый из параметров оказалось, что REQUEST_URI отдаёт полный путь вместе с доменом, т.е. выглядит примерно так: “http://site.ru/some_path”, когда в документации написанно, что должен быть путь без домена: “/some_path”!

.

Желания искать причину бага уже не было(да и гугл выдаёт всего пару случаев, без решения) был быстро написан простой костыль, состоящий из двух файлов: .htaccess и req_url.php.
.htaccess:

php_value auto_prepend_file /full/path/req_url.php

.

req_url.php:

<?php
$_SERVER['REQUEST_URI']=str_replace("http://".$_SERVER["HTTP_HOST"],"",$_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI']=str_replace("https://".$_SERVER["HTTP_HOST"],"",$_SERVER['REQUEST_URI']);
?>

Здесь в htaccess указанно правило, которое обязывает в начале всех скриптов запускать req_url.php, в котором, в свою очередь, написан простой фикс серверной переменной.

.

Оба эти файла находятся в корне папки с сайтами, дабы на всех сайтах всё отлично работало.

.

Похожие записи:

2 комментария к “WordPress 404 и неправильный REQUEST_URI”

  1. Jigsaw Пишет:

    Спасибо! Столкнулся с такой же фигнёй, при переезде…

  2. Andrey Пишет:

    Я вообще стараюсь не заморачиваться с .htaccess , не очень дружу с ним)))

Оставить комменатрий: