스크립트 실행 전에 $ _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.