2012-09-08 4 views
0

나는 이것에 대해 아직 답을 갖고 있지 않기 때문에 여기에 게시하고 있습니다..htaccess 정규 표현식 문제

나는 .htaccess 파일에 root/language/sub/.../document의 형태로 URL과 일치하고 공격에 가까운 root/sub/.../document.php?lang=language

임로 다시하고 싶지만 내 정규 표현식이 아닌 '캐치'입력 URL을 않는 것 같다. 여기에 있습니다 :

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond ^[a-z]{2}.*$/%{REQUEST_FILENAME}\.php -f 
RewriteRule ^([a-z]{2})/(.*)$ $2.php?lang=$1 

누군가가 나를 잘못 지적 할 수 있습니까? 나는 regexp 나 apache를 다시 작성하는 전문가가 아니다.

Tyvm

* 도메인, 즉 편집 *

root 스탠드 여기 mydomain.net

은 몇 가지 예입니다 :

mydomain.net/fr/contact

에 rewriten한다 16,

mydomain.net/contact.php?lang=fr

mydomain.net/en/articles/view

답변

1

나는이 구성을 찾고 있습니다 믿습니다

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} ^(.*/|)(en|de|fr)/(.*)$ [NC] 
RewriteCond %1%3.php -f 
RewriteRule ^(.*/|)(en|de|fr)/(.*)$ $1$3.php?lang=$2 [NC,QSA,L] 

,210

설명 :

RewriteCond %{REQUEST_FILENAME} !-d 

확인 요청 된 URL이 디렉토리가 아닌 경우. '예'인 경우 재 작성이 처리되지 않습니다.

RewriteCond %{REQUEST_FILENAME} ^(.*/|)(en|de|fr)/(.*)$ [NC] 

확인 URL이 /xx/ 일부 내부 xxen, de 또는 fr입니다 포함되어있는 경우. [NC] 플래그는 대문자 및 소문자를 허용하므로 예를 들어 EN 또는 Fr이 허용됩니다. URL에 그러한 "언어"부분이 없으면 재 작성이 처리되지 않습니다. %1(.*/|)하고 %3 이전한다 RewriteCond ^(.*/|)(en|de|fr)/(.*)$에서 (.*) 경기입니다 %1%3.php 파일이 존재하는 경우

RewriteCond %1%3.php -f 

확인합니다. 이러한 PHP 파일이 없으면 다시 쓰기가 처리되지 않습니다. RewriteRule의 왼쪽 상태에서

RewriteRule ^(.*/|)(en|de|fr)/(.*)$ $1$3.php?lang=$2 [NC,QSA,L] 

는이 라인에왔다면 이미한다 RewriteCond로 확인되면서 LANG 부분을 추가하고 있으니, 이제 PHP 파일을 재 작성 처리합니다, 일치하지만되기 때문에 또한 [QSA] 플래그가 있으며, 다른 GET 매개 변수도 유지하므로 lang이 기존 매개 변수에 추가됩니다. 플래그 [L]은 적용해야하는 마지막 다시 쓰기 규칙이며 더 이상 재 작성이이 URL로 처리되지 않는다고 말합니다.

+0

TYVM. 지금 당장은 그것을 확인할 수 없지만, 내일은 분명히 알려줄 것입니다. 지금 나는 아직도 마지막 질문을 가지고있다. 다른 GET 변수를 추가하면'lang = foo' 매개 변수에 추가되어야합니다. 따라서 문자열의 끝에서'\?. *'를 검색하면'& lang = foo'를 추가하고'? lang = foo'를 추가하면됩니다. 이렇게하면 나는 GET 행동을 잃지 않는다. 나는 당신의 앞에 그것과 함께'RewriteRule' 라인을 추가 할 수 있다고 생각합니까? 아니면 각각의'RewriteRule'에 대해'RewriteCond'의 또 다른 블록을 만들어야합니까? 고마워, 나는 대답을 받아 들였다. ^^ – PinkTurtle

+0

(%) :'% {REQUEST_FILENAME} '은 전체 URI 즉'mydomain.net/fr/contact'을 포함합니까? 그렇지 않다면'(. */|)'(두 번째 줄)은 나에게 의미가 없습니다. 그러면 lang이 첫 번째 URL _bit_이됩니다. 또한, (. */|)에서 파이프가'|'무엇입니까? 나는'(. * /)'이'/'로 끝나는 모든 것을 매치한다는 것을 이해한다. 야생 추측 : 선택 조건? 어떠한 경우에도 도움을 주셔서 감사합니다. – PinkTurtle

+0

@JulienMatthey - 플래그'[QSA]'는 자동으로'?'/'&'문제를 처리합니다. 걱정하지 마십시오 :)'(. */|)'에 관한 질문에 대해 - 이것은 '/'사전 언어 약어 또는 빈 문자열이 없으므로'|'는 ** 또는 ** 연산자입니다. 이게 도움이 되길 바란다. –

0

그럼 내가 거기에서 무엇을하고 있는지 루트 모르겠어요 ...

mydomain.net/articles/view.php?lang=en

등 rewriten한다 , 너 시도해 봤어?

RewriteRule ^root/([a-z]{2})/(.*)$ root/$2.php?lang=$1 
+0

죄송합니다. '루트'는 실제로 도메인 (즉, mydomain.net)을 나타냅니다. – PinkTurtle

0

두 번째는 RewriteCond입니다. 그러나 귀하의 질문은 모호합니다. 당신은 당신이

root/sub/.../something.php?lang=foo 

다음이 함께 초조해 시작

root/foo/sub/.../something.php 

에 변환하려는 의미하는 경우 :

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^root/([^/]+)/sub/(.*)/%{REQUEST_FILENAME}$ root/sub/$2/%{REQUEST_FILENAME}?lang=$1 
+0

답변 해 주셔서 감사합니다. 지금 바로 테스트 해보십시오. 방금 편집을 했으므로 읽으십시오. 'root'는 실제로 도메인, 즉'mydomain.net'을 나타냅니다. 너희들 여기 혼동해서 미안해 ^^ – PinkTurtle