Назад | Перейти на главную страницу

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

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

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

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

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

Возможно, связано: теперь у меня также есть пара новых переменных $ _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, о котором я упоминал изначально.

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

Для отсутствующих изображений в одном из наших проектов, которые были перенаправлены на 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'].

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

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

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

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