Могу ли я глобально установить $ _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']Кажется, это одно из таких значений, которое последовательно определяется всеми основными веб-серверами, поэтому вы можете попробовать использовать его вместо этого.


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

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'].


-1

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


В своем вопросе я уже определил это как курс действий, который я бы предпринял, если бы это было невозможно. Это также было то, что я в итоге сделал, согласно редактированию, которое я сделал, прежде чем вы ответили.
— Барри

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

И под «вероятно, правильно» я имею в виду, что именно так я и делал в нескольких местах в прошлом.
— Джон Клоске
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.