스크립트 실행 전에 $ _SERVER [ 'REDIRECT_URL']을 전역 적으로 설정할 수 있습니까?


8

많은 사이트를 이전에서 새 서버 구성으로 마이그레이션하는 중입니다. 각 사이트는 mod_rewrite URL을 사용하는 유사한 (그러나 슬프게도 동일하지 않은) 코드베이스를 기반으로합니다.

  • 우분투 8.04 LTS => 우분투 12.04 LTS
  • 아파치 2.22.8 => 아파치 2.2.22
  • PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)

대부분 매력처럼 작동하지만 새 구성에서는 $ _SERVER [ 'REDIRECT_URL']이 더 이상 설정되지 않으며이 전역 변수에 의존하여 코드가 실패합니다.

내가 이해 한 바에 따르면,이 변수는 리디렉션이 발생할 때 Apache에 의해 설정됩니다. 분명히 이것은 지금 일어나고 있지 않지만 원인을 찾기 위해 고심하고 있습니다.

  • Apache 업그레이드입니까, 아니면 PHP FastCGI에서 PHP5-FPM으로의 전환입니까?
  • 이 변수를 어떻게 되 찾을 수 있습니까?

실제로 각 사이트에서 코드를 편집 할 필요가 없으므로 필요한 경우 전역 PHP auto_prepend를 설정하지만 서버 구성을 수정하여 처음에 설정하는 것이 이상적입니다.

잠재적으로 관련 : 이제 REDIRECT_SCRIPT_URL 및 REDIRECT_REDIRECT_SCRIPT_URL이라는 두 개의 새로운 $ _SERVER 변수가 있습니다. 이것들은 내가 REDIRECT_URL에 대해 올바른 데이터를 가지고있는 것처럼 보이지만 이전에는 없었던 두 가지 내부 리디렉션이 발생했음을 나타냅니다 .Google은 REDIRECT_REDIRECT_SCRIPT_URL을 검색하면 임의의 var_dump 출력 만 반환합니다. SCRIPT_URL이 새로운 REDIRECT_URL입니까?

편집 1

다시 확인하면 REDIRECT_URL은 (현재) 설정되지만 항상 예상 입력 유형 URL 대신 'index.php'(mod_rewrite 대상)로 설정됩니다. PHP auto_prepend_file을 사용하여 필요한 변수를 수동으로 설정했습니다.

처음으로 어떻게 그리웠는지 모르겠지만 그 동안 몇 가지 변경 사항을 적용하여 외부 기회가 없을 것이라고 생각합니다. 이것이 누군가를 오도하는 경우 사과드립니다.

편집 2

아래 ErrorDocument에 대한 언급을 해결하기 위해 사용중인 mod_rewrite 규칙은 다음과 같습니다.

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

$ _GET [ 'url'] 변수가 설정되었으므로 규칙이 작동해야합니다.

분명히하기 위해이 단계에서 처음 언급 한 auto_prepend_file 해결 방법을 사용했습니다.


실사를 표시하지 않은 경우 -1입니다. 빠른 Google 검색은 문서 읽기를 대신 할 수 없습니다. 시스템이나 코드를 업그레이드하기 전에 최소한 시스템이나 프로젝트에 영향을 미치는 한 변경된 내용을 이해해야합니다.
John Gardeniers

명확하지 않은 것에 대한 사과; 가능한 한 문서를 가장 잘 읽었습니다. 그런 다음 설명 할 수없는 것에 반대하여 Google에 의지했습니다. 구성은 별도의 시스템에 있으며 이동 전 테스트 중에 위의 문제를 발견했습니다. 그러나 실수를했기 때문에 질문을 업데이트하겠습니다.
Barry

당신이 우리에게 이러한 것들을 미리 알려 주면 그것은 당신과 우리의 최선의 이익에 달려 있습니다. 나는 투표를 반대했다.
John Gardeniers

이전 및 새 서버 구성에 대한 추가 정보를 제공 할 수 있습니까? PHP에서 REDIRECT_URL 설정은 아파치의 SCRIPT_URL 환경 변수에서 비롯된 것으로 생각되지만 해당 가져 오기의 동작을 수정할 수있는 많은 것들이 있습니다 (예 : suPHP, 랩핑 엔진, AddTypeHandler 문 등).
Jon Kloske

답변:


3

REDIRECT_URL은 Apache 웹 서버 에서만 설정되며 특정 상황에서만 설정됩니다 . 아마도 코드가 의존 해야하는 것이 아닐 수도 있습니다. 내가 알 수있는 한 가장 좋은 해결책은 버그가있는 PHP 코드를 수정하는 것입니다. 아파치에서 이것을 항상 강제로 설정할 수는 없습니다.


답변을 보내 주셔서 감사합니다. 불행히도 내 문제와 관련된 링크에서 아무것도 볼 수 없었습니다. 외부 ErrorDocument가 이것과 관련이 없다고 생각합니다. 기존 코드를 변경할 수 있기를 원하지만 현재로서는 옵션이 아닙니다.
Barry

요점은 REDIRECT_URL은 ErrorDocument 처리 중에 만 설정됩니다. 즉, PHP 스크립트는 원래 구성에서 ErrorDocuments로로드되었으며이를 작성한 사람은이 동작에 의존했습니다. 이제는 일어나지 않기 때문에 스크립트가 깨집니다.
Michael Hampton

사용중인 ErrorDocument 정의가 없으며 mod_rewrite RewriteRule (위에 추가)이 어떻게 관련되어 있는지 볼 수 없습니다. REDIRECT_URL이 보장되지 않음에 대해 귀하에게 동의하지 않고 있습니다. 이유에 대한 관련 문서를 찾을 수 없습니다.
Barry

나는 내 대답에서 위의 내용에 연결했습니다. 더 필요한 것이 있으면 Apache 소스 코드를 읽어야합니다. 어쨌든 옆에있는 확인 표시의 개요를 클릭하여 문제를 해결 한 답변을 수락하고 서버 결함에 오신 것을 환영합니다.
Michael Hampton

0

PHP 문서에 따르면 :

$ _SERVER는 헤더, 경로 및 스크립트 위치와 같은 정보가 포함 된 배열입니다. 이 배열의 항목은 웹 서버에 의해 생성됩니다. 모든 웹 서버가이 중 하나를 제공한다고 보장 할 수는 없습니다. 서버는 일부를 생략하거나 여기에 나열되지 않은 다른 서버를 제공 할 수 있습니다. 그러나 많은 변수가 »CGI / 1.1 사양 에 설명되어 있으므로이를 기대할 수 있습니다.

따라서 모든 초 $_SERVER전역 변수가 예상대로 플랫폼에 구애받지 않는 것 같습니다 . $_SERVER['REQUEST_URI']모든 주요 웹 서버에서 일관되게 정의 된 값 중 하나 인 것 같습니다. 대신 해당 값을 사용해보십시오.


이것에 감사하지만, 나는 때때로 이것이 설정되고 때로는 그렇지 않다는 것을 이미 알고 있었다. 내가 원하는 것은 구성에 따라 특정 사항에 대한 문서를 찾을 수 없기 때문에 특정 구성에 대해 설정되는 변수에 적극적으로 영향을 미치는 방법이었습니다.
Barry

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 코드 스 니펫을 포함하도록 php auto-prepend-file을 설정할 수 있습니다.


내 질문에 나는 이것이 가능하지 않은 경우 취할 행동의 과정으로 이미 이것을 확인했다. 당신이 대답하기 전에 내가 한 편집에 따라 그것은 또한 내가 한 일이었습니다.
Barry

죄송합니다. 게시하기 전에 수정 사항을 본 적이 없습니다. 편집하기 전에 답장을 시작했을 수도 있지만 후속 편집에서 원래 편집 날짜 스탬프를 제거했기 때문에 확신 할 수 없습니다 : / 또한 제안하는 것이 올바른 방법인지 명확하게 확인해야합니다 "대체"보다는 당신이 추구하는 것을 달성하십시오. [E : blah = blah] 플래그를 재 작성 규칙에 사용하여 임의 환경 변수를 설정 한 다음 GET 변수를 사용하여 경로 재 지정 엔진에서 코드로 자료를 전달하는 것보다 깨끗한 사전 포함 파일 내에서 페치 할 수 있습니다.
Jon Kloske

그리고 "아마도 맞습니다"라는 말은 과거에 여러 곳에서이 일을했던 방식입니다.
Jon Kloske
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.