2011-05-03 4 views
9

문제 : 다른 회사에 대한 호스팅 웹 사이트를 개발하는 Kohana/PHP를 사용하여APACHE RewriteRule을 사용하여 REQUEST_URI를 재정의하지 않습니까?

입니다. 고객이 DNS 서버의 CNAME 항목에 내 도메인을 가리 키도록합니다. 예 : http://invites.somecompany.comhttp://www.mydomain.com을 가리 킵니다.

따라서, 내 아파치 서버의 % {HTTP_HOST} 항목은 'invites.somecompany.com'

나는 아파치가 그 일을 할 것 같다 비록 http://invites.somecompany.com/invite http://www.mydomain.com/invites/invite

을 다시 할

, $ _SERVER [ 'REQUEST_URI']는 여전히 "/"입니다. Kohana는 $ _SERVER [ 'REQUEST_URI']을 사용하여 해당 컨트롤러 코드로 요청을 라우팅합니다. 이 경우 '초대 관리자'컨트롤러 대신 베이스 색인 컨트롤러로 라우팅됩니다.

현황 : 내가 (htaccess로 파일에) 사용하고

아파치 mod_rewrite를 지시 : -의 index.php에서

RewriteCond %{HTTP_HOST} !^www.mydomain.com$ 
RewriteCond %{REQUEST_URI} !.*invites.* 
RewriteRule ^(.*)$ invites/$1 

# For Kohana 
RewriteRule .* index.php?kohana_uri=$0 [PT,QSA,L] 

, 내가 할 :

var_dump($_SERVER); 

및 i :

'REQUEST_URI' => string '/', 
'QUERY_STRING' => string 'kohana_uri=invites/index.php&kohana_uri=invites/invite' 
'REDIRECT_QUERY_STRING' => string 'kohana_uri=invites/invite' 

그래서 mod_rewrite는 REQUEST_URI를 수정하지 않습니까?

필요 : 나는 그것을 어떻게합니까

'REQUEST_URI' => 'invites/invite', 
'QUERY_STRING' => string 'kohana_uri=invites/invite', 

?

====================== 편집

재 작성 로그 항목 : -

strip per-dir prefix: /Users/project/invite -> invite 
applying pattern '^(?:application|modules|system)\b.*' to uri 'invite' 
strip per-dir prefix: /Users/project/invite -> invite 
applying pattern '\.git' to uri 'invite' 
strip per-dir prefix: /Users/project/invite -> invite 
applying pattern '^(.*)$' to uri 'invite' 
rewrite invite -> invites/invite 
add per-dir prefix: invites/invite -> /Users/project/invites/invite 
strip per-dir prefix: /Users/project/invites/invite -> invites/invite 
applying pattern '.*' to uri 'invites/invite' 
rewrite invites/invite -> index.php?kohana_uri=invites/invite 
add per-dir prefix: index.php -> /Users/project/index.php 
strip document_root prefix: /Users/project/index.php -> /index.php 
internal redirect with /index.php [INTERNAL REDIRECT] 
strip per-dir prefix: /Users/project/index.php -> index.php 
applying pattern '^(?:application|modules|system)\b.*' to uri 'index.php' 
strip per-dir prefix: /Users/project/index.php -> index.php 
applying pattern '\.git' to uri 'index.php' 
strip per-dir prefix: /Users/project/index.php -> index.php 
applying pattern '^(.*)$' to uri 'index.php' 
rewrite index.php -> invites/index.php 
add per-dir prefix: invites/index.php -> /Users/project/invites/index.php 
strip per-dir prefix: /Users/project/invites/index.php -> invites/index.php 
applying pattern '.*' to uri 'invites/index.php' 
rewrite invites/index.php -> index.php?kohana_uri=invites/index.php 
add per-dir prefix: index.php -> /Users/project/index.php 
initial URL equal rewritten URL: /Users/project/index.php [IGNORING REWRITE] 
+0

이것이 바로 mod_rewrite의 작동 방식입니다. – zerkms

+0

hmmmmmmmmmmmmmm – Ajoy

답변

-1

는 나의 이전의 대답을 삭제 잘못되었다. 문서 링크를 제공해 주셔서 감사 드리며 새로운 것을 배웠습니다.

# For Kohana 
RewriteRule .* index.php?kohana_uri=$0 [PT,L] 

Per the Docs :

QSA 플래그를 제거

'qsappend | QSA'(쿼리 문자열 추가)합니다 이 플래그는 로 재 작성 엔진의 쿼리 문자열 부분을 추가 강제 문자열을 기존의 문자열로 바꾸는 대신 교체하십시오. 을 사용하면 다시 쓰기 규칙을 통해 에 쿼리 문자열을 더 추가 할 수 있습니다.

처음 알았어 야합니다.

+0

사실이 아닙니다. check http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule "역 참조는 N 번째 그룹의 내용으로 대체 될 $ N (N = 0..9) 식별자입니다. 일치하는 패턴. " – Ajoy

+0

나는 문서화에 대해 논쟁을하지 않겠다. 그러나 나는 $ 0이 사용 된 것을 결코 보지 못했다. 또한, 이전 규칙에서 내가 말한 것을 정확하게 수행하고 있습니다. 왜 불일치? – bradym

+0

나는 전에 $ 0을 사용했으며 작동합니다 (preg_match와 동일). 불일치는 나쁘지 만 일관성있게 만들지 만 (전체적으로 $ 0 사용) 결과는 여전히 동일합니다. – Ajoy

1

1.) 수동으로 호출하면이 링크가 작동합니까? 필요 RewriteCond %{HTTP_HOST} !^www.mydomain.com$http://www.mydomain.com/invites/invite

2.)의 index.php 정규식에 맞는 .*RewriteRule .* index.php?kohana_uri=$0 [PT,QSA,L]도 무한 루프)

3. RewriteCond %{HTTP_HOST} !^www\.mydomain\.com$ 같이 이스케이프한다.

4.) 사용자가/RewriteRule ^(.*)$ invites/$1 [R=301]을 초대하도록 리디렉션하려면 R 플래그가 필요합니다. %{REQUEST_URI}은 브라우저 주소 표시 줄과 동일한 URI입니다.

5. 방문자를 리디렉션하지 않으려면 kohana 시스템을 "해킹"할 수 있으며 index.php의 첫 번째 줄에 $_SERVER['REQUEST_URI'] = $_GET['myURI'];을 설정하면 실행할 수있는 유일한 옵션입니다. myURI은 원하는대로 mod_rewrite로 채울 수 있습니다.

+0

감사합니다. @mgutt. 5) 내가 끝낸 일이다. – Ajoy

+0

재미있는 또 다른 재미있는 사실을 배웠습니다. .htaccess 파일에서 규칙을 다시 작성하면 두 번 실행됩니다. 다른 방법은 httpd.conf 파일에 다시 쓰기 규칙을 플러그인하는 것이지만 '400 잘못된 요청'오류가 계속 발생합니다. – Ajoy

0

mod_rewrite가 작동하는 방식으로 인해 바로 $_SERVER['REQUEST_URI']에있을 수 없습니다. 당신이 $_SERVER (때로는 나쁜 생각이라고 생각하는)을 수정하게되면, 다음과 같이하면 어떨까요?

$_SERVER['REQUEST_URI'] = $_GET['kohana_uri']; 
$_SERVER['QUERY_STRING'] = $_SERVER['REDIRECT_QUERY_STRING']; 
관련 문제