CodeIgniter에서 PHP 애플리케이션을 구축하고 있습니다. CodeIgniter는 모든 요청을 메인 컨트롤러로 보냅니다 : index.php
. 그러나 나는 index.php
URI에서 보고 싶지 않습니다 . 예를 들어 http://www.example.com/faq/whatever
는로 라우팅됩니다 http://www.example.com/index.php/faq/whatever
. 스크립트가 주소가 무엇인지 알 수있는 신뢰할 수있는 방법이 필요하므로 탐색으로 무엇을해야하는지 알 수 있습니다. mod_rewrite
CodeIgniter 문서에 따라을 사용했습니다 .
규칙은 다음과 같습니다.
RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
일반적으로 나는 단지 확인 php_self
하지만이 경우에는 항상 index.php
입니다. 나는에서 그것을 얻을 수 REQUEST_URI
, PATH_INFO
등,하지만 난 가장 신뢰할 수있을 것입니다 결정하기 위해 노력하고있어. 사람의 노하우를합니까 (또는 어디에서 찾을 알고) 사이의 진정한 차이 PHP_SELF
, PATH_INFO
, SCRIPT_NAME
,와 REQUEST_URI
? 당신의 도움을 주셔서 감사합니다!
참고 : 나는 밑줄이 보이기 때문에 공백을 추가해야했으며 어떤 이유로 든 기울임 꼴로 만듭니다.
업데이트 됨 : 공백을 수정했습니다.
답변
PHP 문서는 당신에게 그 차이를 알 수 있습니다 :
‘PHP_SELF’
문서 루트를 기준으로 현재 실행중인 스크립트의 파일 이름입니다. 예를 들어, $ _SERVER [ ‘PHP_SELF’] 주소에서 스크립트 http://example.com/test.php/foo.bar는 것 /test.php/foo.bar . __FILE__의 상수는 현재의 전체 경로와 파일 이름을 포함 파일 (예 포함). PHP가 명령 줄 프로세서로 실행되는 경우이 변수에는 PHP 4.3.0 이후의 스크립트 이름이 포함됩니다. 이전에는 사용할 수 없었습니다.
‘SCRIPT_NAME’
현재 스크립트의 경로를 포함합니다. 이것은 자신을 가리켜 야하는 페이지에 유용합니다. __FILE__의 상수는 현재의 전체 경로와 파일 이름을 포함 파일 (예 포함).
‘REQUEST_URI’
이 페이지에 액세스하기 위해 제공된 URI. 예를 들어, ‘/index.html’ .
PATH_INFO가 문서화되지 않은 것 같습니다 …
답변
이러한 변수 간의 차이점에 대한 몇 가지 실제 예 :
예 1. PHP_SELF는 요청 된 URL이 http://example.com/test.php/foo/bar 형식 일 때만 SCRIPT_NAME과 다릅니다
.
[PHP_SELF] => /test.php/foo/bar
[SCRIPT_NAME] => /test.php
(이는 PATH_INFO에 합리적인 정보가 포함 된 유일한 경우 인 것 같습니다. [PATH_INFO] => / foo / bar) 참고 : 이전 PHP 버전 (<= 5.0?)에서는 달라졌습니다.
예 2. 비어 있지 않은 쿼리 문자열을 입력 할 때 REQUEST_URI는 SCRIPT_NAME과 다릅니다.
http://example.com/test.php?foo=bar
[SCRIPT_NAME] => /test.php
[REQUEST_URI] => /test.php?foo=bar
예 3. REQUEST_URI는 서버 측 리디렉션이 적용될 때 SCRIPT_NAME과 다릅니다 (예 : 아파치의 mod_rewrite).
[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test2.php
예 4. REQUEST_URI는 스크립트로 HTTP 오류를 처리 할 때 SCRIPT_NAME과 다릅니다.
Apache 지시문 사용 ErrorDocument 404 /404error.php
http://example.com/test.php
[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /404error.php
사용자 지정 오류 페이지 http://example.com/test.php를 사용하는 IIS 서버에서
[SCRIPT_NAME] => /404error.php
[REQUEST_URI] => /404error.php?404;http://example.com/test.php
답변
PATH_INFO
다음과 같이 htaccess를 사용할 때만 사용할 수 있습니다.
예 1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]
동일하게 유지
[SCRIPT_NAME] => /index.php
뿌리
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI] => /
[QUERY_STRING] =>
통로
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test
[QUERY_STRING] =>
쿼리 문자열
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test?123
[QUERY_STRING] => 123
예 2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
동일하게 유지
[SCRIPT_NAME] => /index.php
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
뿌리
[REQUEST_URI] => /
[QUERY_STRING] =>
통로
[REQUEST_URI] => /test
[QUERY_STRING] => url=test
쿼리 문자열
[REQUEST_URI] => /test?123
[QUERY_STRING] => url=test&123
예제 3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(([a-z]{2})|(([a-z]{2})/)?(.*))$ index.php/$5 [NC,L,E=LANGUAGE:$2$4]
또는
RewriteRule ^([a-z]{2})(/(.*))?$ $3 [NC,L,E=LANGUAGE:$1]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]
동일하게 유지
[SCRIPT_NAME] => /index.php
뿌리
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI] => /
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] IS NOT AVAILABLE
통로
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] =>
언어
[PHP_SELF] => /index.php/
[PATH_INFO] => /
[REQUEST_URI] => /en
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] => en
언어 경로
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /en/test
[REDIRECT_LANGUAGE] => en
언어 쿼리 문자열
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /en/test?123
[QUERY_STRING] => 123
[REDIRECT_LANGUAGE] => en
답변
PHP 경로
$_SERVER['REQUEST_URI']
= 웹 경로, 요청 된 URI
$_SERVER['PHP_SELF']
= 웹 경로, 요청 된 파일 + 경로 정보
$_SERVER['SCRIPT_NAME']
= 웹 경로, 요청 된 파일
$_SERVER['SCRIPT_FILENAME']
= 파일 경로, 요청 된 파일
__FILE__
= 파일 경로, 현재 파일
어디
- 파일 경로 는 별칭 확인 후 와 같은 시스템 파일 경로입니다.
/var/www/index.php
- 웹 경로 는 from
과 같은 서버 문서 경로 이며 어떤 파일과도 일치하지 않을 수 있습니다./index.php
http://foo.com/index.php
- 현재 파일 은 포함 된 스크립트 파일을 의미 하며이를 포함 하는 스크립트가 아닙니다.
- 요청 된 파일 은 포함 된 스크립트 파일 이 아니라 includer 스크립트 파일을 의미 합니다.
- URI 는 URL 재 작성 전과 같은 HTTP 요청입니다.
/index.php?foo=bar
- 경로 정보 는 스크립트 이름 뒤에 있지만 쿼리 문자열 앞에있는 추가 Apache 데이터입니다.
운영 순서
- 클라이언트가 서버에 HTTP 요청을 보냅니다.
REQUEST_URI
- 서버 는 .htaccess 파일 등에서 URL 재 작성 을 수행 하여
PHP_SELF
- 서버
PHP_SELF
는SCRIPT_FILENAME
+ 로 분리 됩니다.PATH_INFO
- 서버 는 별칭 확인을 수행 하고 전체 URL 경로 를 시스템 파일 경로 로 변환합니다. 얻기
SCRIPT_FILENAME
- 결과 스크립트 파일에는 다른 파일이 포함될 수 있습니다. 여기서는
__FILE__
현재 파일의 경로를 나타냅니다.
답변
URI 클래스 를 살펴보고 $ this-> uri-> uri_string ()을 사용할 수 있습니다.
전체 URI가있는 문자열을 반환합니다.
예를 들어 이것이 귀하의 전체 URL 인 경우 :
http://example.com/index.php/news/local/345
이 함수는 다음을 반환합니다.
/news/local/345
또는 구문 분석 / 정규식 값을 제시하지 않고도 세그먼트를 사용하여 특정 영역을 드릴 다운 할 수 있습니다.
답변
개인적으로 $REQUEST_URI
서버 디스크의 위치가 아닌 입력 된 URI를 참조하므로를 사용합니다 .
답변
Odin의 대답에 추가 할 것이 거의 없습니다. URL 재 작성 및 별칭의 효과를 설명하기 위해 HTTP 요청에서 파일 시스템의 실제 파일에 대한 완전한 예제를 제공하고자했습니다. 파일 시스템에서 스크립트 /var/www/test/php/script.php
는
<?php
include ("script_included.php")
?>
곳 /var/www/test/php/script_included.php
이다
<?php
echo "REQUEST_URI: " . $_SERVER['REQUEST_URI'] . "<br>";
echo "PHP_SELF: " . $_SERVER['PHP_SELF'] . "<br>";
echo "QUERY_STRING: " . $_SERVER['QUERY_STRING'] . "<br>";
echo "SCRIPT_NAME: " . $_SERVER['SCRIPT_NAME'] . "<br>";
echo "PATH_INFO: " . $_SERVER['PATH_INFO'] . "<br>";
echo "SCRIPT_FILENAME: " . $_SERVER['SCRIPT_FILENAME'] . "<br>";
echo "__FILE__ : " . __FILE__ . "<br>";
?>
와 /var/www/test/.htaccess
이다
RewriteEngine On
RewriteRule before_rewrite/script.php/path/(.*) after_rewrite/script.php/path/$1
Apache 구성 파일에는 별칭이 포함됩니다.
Alias /test/after_rewrite/ /var/www/test/php/
http 요청은
www.example.com/test/before_rewrite/script.php/path/info?q=helloword
출력은
REQUEST_URI: /test/before_rewrite/script.php/path/info?q=helloword
PHP_SELF: /test/after_rewrite/script.php/path/info
QUERY_STRING: q=helloword
SCRIPT_NAME: /test/after_rewrite/script.php
PATH_INFO: /path/info
SCRIPT_FILENAME: /var/www/test/php/script.php
__FILE__ : /var/www/test/php/script_included.php
다음은 항상 유지
PHP_SELF = SCRIPT_NAME + PATH_INFO = full url path between domain and query string.
mod_rewrite, mod_dir, ErrorDocument 재 작성 또는 URL 재 작성 형식이없는 경우
REQUEST_URI = PHP_SELF + ? + QUERY_STRING
별명은 시스템 파일 경로에 영향을 SCRIPT_FILENAME
하고 __FILE__
아래 예외를 참조 -이 아니라 이전에 정의 된 URL 경로를. 별칭은를 포함하여 전체 URL 경로를 사용할 수 있습니다 PATH_INFO
. SCRIPT_NAME
와 사이에 전혀 연결이 없을 수 있습니다 SCRIPT_FILENAME
.
별칭이 [PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
파일 시스템을 검색하는 것으로 간주되고 Odin의 답변에서 예 4에서 파일이 존재하는지 확인하기 위해 파일 시스템이 검색된다는 것을 알고 있기 때문에 URL 경로 가 정의 될 때 별칭이 확인되지 않는다는 것은 완전히 정확하지 않습니다 . 그러나 이것은 파일을 찾을 수없는 경우에만 관련됩니다. 마찬가지로, mod_dir은 mod_alias를 호출하여 파일 시스템을 검색하지만 이는 같은 별칭이 Alias \index.php \var\www\index.php
있고 요청 uri가 디렉토리 인 경우에만 관련이 있습니다 .