Могу ли я глобально установить $ _SERVER ['REDIRECT_URL'] перед выполнением скрипта?

8

Я нахожусь в процессе миграции многих сайтов со старой конфигурации сервера на новую. Каждый сайт основан на похожей (но, к сожалению, не идентичной) кодовой базе с использованием URL-адресов mod_rewrite.

  • Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
  • Apache 2.22.8 => Apache 2.2.22
  • PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)

В основном работает как шарм, но в новой конфигурации $ _SERVER ['REDIRECT_URL'] больше не устанавливается, и код не выполняется из-за зависимости от этой глобальной переменной.

Насколько я понимаю, эта переменная устанавливается Apache, когда происходит перенаправление. Очевидно, сейчас этого не происходит, но я изо всех сил пытаюсь найти причину.

  • Это обновление Apache или (по-моему) переход с PHP FastCGI на PHP5-FPM?
  • Как мне вернуть эту переменную?

Я бы действительно не хотел редактировать код на каждом сайте, поэтому при необходимости я установлю глобальный PHP auto_prepend для PHP, но в идеале я бы хотел исправить конфигурацию сервера и иметь этот набор в первую очередь.

Потенциально связаны: теперь у меня также есть пара новых переменных $ _SERVER, а именно REDIRECT_SCRIPT_URL и REDIRECT_REDIRECT_SCRIPT_URL. Кажется, они содержат правильные данные, которые я хочу для REDIRECT_URL, но также указывают на то, что произошли два внутренних перенаправления, которых раньше не было - Google ищет REDIRECT_REDIRECT_SCRIPT_URL, возвращает только случайные выходные данные var_dump. Является ли SCRIPT_URL новым REDIRECT_URL?

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

Повторная проверка REDIRECT_URL (сейчас) установлена, но всегда в «index.php» (цель mod_rewrite) вместо ожидаемого набранного URL. Я прибегнул к использованию PHP auto_prepend_file, чтобы вручную установить необходимую переменную.

Я не уверен, как я пропустил это в первый раз, но я тем временем внес несколько изменений, поэтому я полагаю, что есть шанс, что его там не было. Извинения, если это вводит в заблуждение кого-либо.

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

Чтобы учесть упоминания ErrorDocument ниже, используется правило mod_rewrite:

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

Переменная $ _GET ['url'] установлена, поэтому правило должно работать.

Чтобы было ясно, на этом этапе я использовал обходной путь auto_prepend_file, который я упомянул изначально.

Барри
источник
-1 за неспособность проявить должную осмотрительность. Быстрый поиск в Google не заменяет чтение документации. Перед обновлением систем или кода вы должны убедиться, что понимаете, что изменилось, по крайней мере, насколько это влияет на ваши системы или проекты.
Джон Гарденье
Извинения за то, что не ясно; Я прочитал документацию настолько хорошо, насколько мог. Затем я прибег к Google, когда натолкнулся на что-то, что не смог объяснить. Конфигурация находится на отдельной машине, и во время предварительного тестирования я обнаружил вышеуказанную проблему. Однако я обнаружил допущенную ошибку, поэтому собираюсь обновить вопрос.
Барри
Это действительно в ваших и наших интересах, если вы сообщите нам об этом заранее. Я поменял свой голос.
Джон Гарденье
Можете ли вы дать нам больше информации о предыдущей и новой конфигурации сервера? Я считаю, что настройка REDIRECT_URL в PHP происходит из переменной окружения SCRIPT_URL в apache, но есть много вещей, которые могут изменить поведение этого импорта (например, suPHP, механизмы упаковки, операторы AddTypeHandler и т. Д.).
Джон Клоске

Ответы:

3

REDIRECT_URL устанавливается только веб-сервером Apache и только при определенных обстоятельствах . Вероятно, это не то, на что должен опираться ваш код. Насколько я могу судить, лучшим решением было бы исправить ошибочный код PHP; Вы не можете заставить это быть всегда установленным в Apache.

Майкл Хэмптон
источник
Спасибо за ответ, хотя, к сожалению, я ничего не увидел по этой ссылке, связанной с моей проблемой. Я не думаю, что внешний ErrorDocument вовлечен в это. Я хотел бы изменить существующий код, но на данный момент это не вариант.
Барри
Дело в том, что REDIRECT_URL устанавливается только во время обработки ErrorDocument. Это означает, что ваши PHP-скрипты были загружены как ErrorDocuments в исходной конфигурации, и тот, кто их написал, полагался на это поведение. Теперь, когда этого не происходит, сценарии ломаются.
Майкл Хэмптон
Нет используемых определений ErrorDocument, и я не могу видеть, как mod_rewrite RewriteRule (добавленный выше) вовлекает одно. Я не соглашаюсь с вами о том, что REDIRECT_URL не гарантируется, я просто не могу найти какую-либо соответствующую документацию относительно того, почему.
Барри
Я связался с этим выше в своем ответе. Если вам нужно что-то еще, вам придется прочитать исходный код Apache. В любом случае, не забудьте принять ответ, который разрешил вашу проблему, щелкнув контур галочки рядом с ним, и добро пожаловать в сбой сервера.
Майкл Хэмптон
0

Согласно документации PHP:

$ _SERVER - массив, содержащий информацию, такую ​​как заголовки, пути и местоположения сценария. Записи в этом массиве создаются веб-сервером. Нет никакой гарантии, что каждый веб-сервер предоставит какой-либо из них; серверы могут опускать некоторые или предоставлять другие, не перечисленные здесь. Тем не менее, большое количество этих переменных учитывается в спецификации »CGI / 1.1 , так что вы должны иметь возможность ожидать их.

Таким образом, может показаться, что не все $_SERVERсуперглобальные переменные настолько независимы от платформы, как можно было бы ожидать. $_SERVER['REQUEST_URI']Кажется, это одно из таких значений, которое последовательно определяется всеми основными веб-серверами, поэтому вы можете попробовать использовать его вместо этого.

Garrett
источник
Спасибо за это, но я уже знал, что иногда это установлено, а иногда нет. То, на что я надеялся, - это способ активно влиять на то, какие переменные устанавливаются для моей конкретной конфигурации, поскольку я не могу найти какую-либо документацию по специфике, основанной на моей конфигурации (т. Е. Как бы я узнал до сборки среды).
Барри
0

Для отсутствующих изображений в одном из наших проектов, которые были перенаправлены в index.php, я просто использовал это исправление:

url: http://www.domanXY.de/image.php?file=var/binaries/store/8dfaadde-5309-4a35-8f9a-d8b9cd807aae.jpg&options=&options=resize_outer(320,150);sharpen(64) ;

<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";

Если вам нужно глобальное решение, я думаю, что вы должны использовать explode () и т. Д. И использовать другую переменную, такую ​​как $ _SERVER ['REQUEST_URI'].

Fusca Software
источник
-1

Вы можете установить php auto-prepend-file для включения небольшого фрагмента PHP-кода, который устанавливает эту переменную.

Джон Клоске
источник
В своем вопросе я уже определил это как курс действий, который я бы предпринял, если бы это было невозможно. Это также было то, что я в итоге сделал, согласно редактированию, которое я сделал, прежде чем вы ответили.
Барри
Извиняюсь, я не помню, чтобы видел редактирование прежде, чем я отправил; возможно, я начал отвечать до того, как вы произвели редактирование, но я не уверен, так как последующее редактирование удалило исходную метку даты редактирования: / Я также должен был прояснить, что то, что я предлагал, вероятно, является правильным способом достичь того, что вы хотите, а не "запасной вариант". Вы можете использовать флаги [E: blah = blah] в правилах перезаписи, чтобы установить произвольные переменные окружения, чтобы затем извлекать их из файла предварительного включения, который чище, чем использование переменных GET для передачи данных из механизма перенаправления в ваш код.
Джон Клоске
И под «вероятно, правильно» я имею в виду, что именно так я и делал в нескольких местах в прошлом.
Джон Клоске