2010-08-23 3 views
0

나는 여기 벽을 거의 쳤다. 내가 알 수있는 한, 이것이 효과가 있지만 그렇지 않습니다.Apache RewriteRule 및 논리 건너 뛰기

로컬 개발 주소에 * .localhost의 와일드 카드 하위 도메인과/[0-9]/somestring의 친숙한 URL이 있습니다. 내가하려는 일은 username.localhost/1/page에서 localhost?pageId=1&username=username 사이입니다. 이 문제는 username.localhost의 홈페이지와 username.localhost/1/page와 같은 개별 페이지를 모두 얻으려고 시도 할 때 발생합니다.

RewriteRule ^([0-9]+)/[a-zA-Z0-9\-\_\,\.]+$ - [S=1] 
RewriteCond %{HTTP_HOST} !^www.* [NC] 
RewriteCond %{HTTP_HOST} ^([^\.]+)\.localhost 
RewriteRule ^index.php$ index.php?username=%1 
RewriteRule ^([0-9]+)/[a-zA-Z0-9\-\_\,\.]+$ index.php?pageId=$1&username=%1 

/1/페이지 페이지를 사용하면 첫 번째 규칙은 일치 및 건너 뛰기를 건너 뛰지 만 올바르게 다시 쓰지 못합니다. 그러나 처음 두 규칙을 제거하면/1/페이지 페이지를 다시 작성합니다.

마치 건너 뛰지 않은 것처럼 보이지만 아직 S = 2로 변경하면 두 규칙이 모두 건너 뜁니다. 아하. 어떤 아이디어?

답변

1

내가 알 수있는 바로는 실제로 입니다. 단지 그 일이 끝나면 규칙 집합에 두 번째가 있습니다. 무엇이 일어나고있는 것은 다음과 같이 더 구체적으로 보이는 :

  • 요청 http://username.localhost/1/page에이 S=1
  • 입력 1/page 세 번째 규칙과 일치, URL을 다시 작성 적용,
  • 입력 1/page 첫 번째 규칙과 일치를 만들어 index.php?pageId=1&username=username
  • 내부 리디렉션은 mod_rewrite (지금까지는 모두 좋았지 만 ...)
  • mod_rewrite은 내부 리디렉션을 처리하고 sta 규칙 처리 RTS 다시
  • 입력 index.phpS=1
  • 입력 index.php 번째 규칙 일치를 적용하지 않고, 상기 제 규칙과 일치하지 않고, URL은 index.php?username=username
  • (내부 리디렉션 다시 동일한 발생에 재기록 재 작성을 수행하지만, mod_rewrite가 리디렉션 루프를 감지하고) 지금 처리를 중지한다

이이 문제를 해결하는 몇 가지 방법이 있습니다,하지만 난 여기에 가장 쉬운 일을 생각 만 확인 파일이 존재하지 않을 수 있도록하는 것입니다, 마지막 ru에서 패턴을 굴려 라. 이전의 조건으로 제작 : :

# Make sure we haven't rewritten to a file yet (the "directory" gets processed 
# before DirectoryIndex index.php is applied) 
RewriteCond %{REQUEST_FILENAME} !-f 
# Check that the input doesn't match the pattern we want handled later 
RewriteCond $0   !^([0-9]+)/[a-zA-Z0-9_,.-]+$ 
RewriteCond %{HTTP_HOST} !^www.* [NC] 
RewriteCond %{HTTP_HOST} ^([^\.]+)\.localhost 
RewriteRule ^.*$ index.php?username=%1 

RewriteRule ^([0-9]+)/[a-zA-Z0-9_,.-]+$ index.php?pageId=$1&username=%1 

편집 : 위의 버전은 페이지의 패턴과 일치하지 않는 물건을 잡아 그들이 원하는되지 않을 수 있습니다 index.php?username=username을이었다 같은 역할을합니다. 다음은이를 피하고 어쨌든 좀 더 간결합니다.

RewriteCond %{HTTP_HOST} !^www.* [NC] 
RewriteCond %{HTTP_HOST} ^([^\.]+)\.localhost 
RewriteRule ^$ index.php?username=%1 

RewriteRule ^([0-9]+)/[a-zA-Z0-9_,.-]+$ index.php?pageId=$1&username=%1 
+0

답변 해 주셔서 감사합니다. 규칙을 두 번째 실행하면 전체적으로 렌치를 던질 수있는 논리를 볼 수 있습니다. 미안하지만 조금 밀도가 높습니다. 그러나 솔루션으로 어떻게 해결되는지 따라갈 수 없습니다. REQUEST_FILENAME은 항상 존재하게 될 index.php로 나오며, 결과적으로 이것을 시도하는 것은 꺼내지 않는 것 같습니다. –

+0

@Zurahn - 'http : // username.localhost /'에 대한 요청은 도메인 다음에 요청 경로가 없기 때문에'/ website/root/dir /'의 초기 '% {REQUEST_FILENAME}'을 갖습니다. 이것은 파일이 아니므로'! -f' 조건은 첫 번째 패스에서 true입니다.후속 패스 ('RewriteRule' 때문에이 경우'DirectoryIndex'가 적용된 경우에도 마찬가지 임)에서'% {REQUEST_FILENAME} '은'/ website/root/dir/index.php'가됩니다. 조건이 실패하여 실수로 첫 번째 재 작성을 다시 수행하지 못하게하는 파일입니다. –

+0

모든 도움에 감사드립니다. 당신이 제공 한 것을 가지고 일할 것이고 그것을 관리 할 수 ​​있어야한다고 생각합니다. –