2010-04-16 4 views
0

값을 전달하는 여러 페이지가 다르기 때문에이를 일반화 할 수있는 규칙을 작성하려고합니다. 지금 내가 할 수있는 :URL의 많은 정의되지 않은 매개 변수에 대한 일반 RewriteRule

Nome+del+Forum/+/page_1/action_do 

가 반환해야합니다 :

RewriteRule ^forum/([^/]{1,255})/([\+]{1})/((([a-z]+)([_]{1})([a-zA-Z0-9]+)([/]?))+)$ forum.php?name=$1&$5=$7 [L] 

는 다음과 같은 해결하기 위해

forum.php?name=Nome+del+Forum&page=1&action=do 

을 대신,이 경우에는 (마지막 매개 변수를 사용 행동 = do) :

forum.php?name=Nome+del+Forum&action=do 

어떻게 수정할 수 있습니까? 미리 감사드립니다!

답변

0

가장 쉬운 방법은 RewriteMap prg:foo을 사이트 구성에 넣을 수있는 경우입니다. 내가 아는 한 RewriteMap.htaccess에 사용할 수 없습니다.

선택한 .htaccess 시도에서 그런
RewriteMap forum prg:/path/to/forum-rewriter.pl 

:

당신도 세계적으로 또는 <VirtualHost>에, 서버 구성 파일에 액세스 할 수있는이 같은 것을 추가하는 경우

RewriteRule ^forum/.* ${forum:$0} [QSA] 

(에서 당신의 RewriteRule 시도했습니다. forum/으로 시작하는 경로에서 일치하길 원했던 것처럼 보였습니다. 그래서 제가 여기서하고있는 경로입니다.)

,210

다음 당신은 forum-rewriter.pl을해야합니다

#!/usr/bin/perl 

use strict; 
use warnings; 


$| = 1; 
while ($_ = <STDIN>) { 
    chomp($_); 
    if (s,^forum/([^/]+)(/\+)?(/.*)?,forum.php?name=$1, && $3) { 
     my $query_string = $3; 
     $query_string =~ s,/([^/_]+)_([^/_]+),&$1=$2,g; 
     $_ .= $query_string; 
    } 
    print "$_\n"; 
} 

chmod 755 /path/to/forum-rewriter.pl에 있는지 확인합니다.

RewriteMap은 시작시 모든 httpd 프로세스에 대해 Apache가 forum-rewriter.pl 번씩 시작되도록합니다. RewriteRule의 패턴이 일치 할 때마다 forum-rewriter.pl의 stdin에 대한 경로를 씁니다. forum-rewriter.pl은 (있는 경우) URL에서 작업을 수행하고 결과를 Apache로 다시 인쇄합니다.

참고로 매우 쉽게 forum-rewriter.pl을 테스트 할 수 있습니다. 그냥 실행하고 그것을 경로 전송 시작 ​​: 당신이 RewriteMap을 사용할 수없는 경우, 나는 그것이 mod_rewrite가능한 것 같아요

$ /tmp/forum-rewriter.pl 
forum/Nome+del+Forum/+/page_1/action_do 
forum.php?name=Nome+del+Forum&page=1&action=do 
forum/Nome+del+Forum/page_1/action_do 
forum.php?name=Nome+del+Forum&page=1&action=do 
forum/Nome+del+Forum 
forum.php?name=Nome+del+Forum 
foo 
foo 

을하지만, 나는이 위험한 생각 :

RewriteCond %{ENV:SetForumName} ="" 
RewriteRule ^forum/([^/]+)(/\+)?(/.*)? /forum.php$3?name=$1 [QSA,E=SetForumName:1] 
RewriteCond %{ENV:SetForumName} !="" 
RewriteRule ^forum.php/([^/_]+)_([^/_]+)(/.*)? /forum.php$3?$1=$2 [N,QSA] 

그것은 위험이 있기 때문에 [N]은 두 번째가 RewriteRule 일 때 Apache가 모든 다시 쓰기 규칙 처리를 다시 시작하게합니다. 조심하지 않으면 무한 루프를 만들고 아파치는 요청이나 악의를 제기 할 것이다. 또한 환경 변수 인 SetForumName을 설정한다는 부작용에 유의하십시오.그러나 이것은 mod_rewrite에게 "을 모두foo_bar으로 바꾸고 쿼리 문자열에 foo=bar으로 바꾸는 유일한 방법입니다."

0

같은 것 this?

그리고 추가 정보는 this을 참조하십시오.

기본 정보는

RewriteCond %{QUERY_STRING} ^(.*)$ 
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L] 
RewriteCond %{QUERY_STRING} ^(.*)$ 
RewriteRule ^([^/]+)/ $1?%1 [L] 

그것은 첫 번째 매개 변수를 받아 해당 페이지를 호출하는 다음

/mypage/param1/val1/param2/val2/param3/val3/...  ---> 
/mypage?param1=val1&param2=val2&param3=val3&... 

다시 작성됩니다 이러한 규칙입니다. 나머지 매개 변수는 쿼리 문자열로 바뀝니다.

코드 편집 방법에 대해 자세히 알아보십시오.

첫 번째 줄 (및 세 번째 줄)은 "?" 재 작성된 URL의 끝에 다시 추가 할 수 있습니다. 과 같은 것은 [QSA] 플래그로 수행 할 수 있지만 표시하려면 을 명시 적으로 사용하는 것이 좋습니다.

문자열이 % 1 변수에 저장됩니다.

두 번째 줄에는 일반 표현식을 사용하여 URL을 세 부분으로 나눕니다.

$ 2와 $ 3은 경로의 마지막 두 부분입니다. $ 1 전의 모든 것입니다.

그래서이 :

/mypage/param1/val1/param2/val2/param3/val3/param4/val4/param5/val5/ 

이되다 :

$1              $2  $3 
/mypage/param1/val1/param2/val2/param3/val3/param4/val4/ param5 val5 

및 (가독성을 위해 추가 공간)이 같이 다시한다 :

/mypage/param1/val1/param2/val2/param3/val3/param4/val4/ ? param5 = val5 

귀하의 URL이 아닌 다른 구분을 사용하는 경우 슬래시를 사용하면 일반 표현을 수정할 수 있습니다.

[L] ("last") 플래그는 나머지 규칙이 실행되지 않도록합니다. 그러나 이것이 핵심입니다 - mod_rewrite가 새로운 URL로 웹 서버를 호출하고 새로운 URL이 mod_rewrite를 통해 다시 전송됩니다! 이것은 종종 mod_rewrite 재귀라고 불리는데, 이것이 정확하게 작동하기를 원하는 것입니다.

다음 번에 다음 두 부분이 끝에서 제거되고 이 쿼리 문자열에 추가됩니다.

이 :

$1           $2  $3  %1 
/mypage/param1/val1/param2/val2/param3/val3 param4 val4 ? param5=val5 

이되다 :

이것은 URL의 모든 부분이 쿼리 문자열의 부분으로 변환 될 때까지 일어나고 계속해서
/mypage/param1/val1/param2/val2/param3/val3 ? param4 = val4 & param5=val5 

.이 경우 두 번째 줄은 과 일치하지 않지만 네 번째 줄은 일치합니다. 그것이 바로 프로그램에 전화 할 수있는 최종 도착 URL입니다. 위 링크는 다른 규칙을 허용하는 약간 다른 변형 인 에 대한 답변을 보여줍니다.

mod_rewrite 에 재귀가 발생할 수있는 횟수에는 제한이 있습니다. .htaccess의 MaxRedirects 및 apache conf 파일의 LimitInternalRecursion 의 설정을 참조하십시오.

+0

죄송하지만 이해가 안됩니다! 전체 코드는 필요 없지만 코드는 어떻게 이해해야합니다. 페이지는 항상 포럼이며 값은 슬래시로 구분되지 않고 "_"또는 ":"로 구분됩니다. 이 코드를 사용하면 :

\t RewriteCond %{QUERY_STRING} ^(.*)$ \t RewriteRule ^forum/([^/]{1,255})/([^/]+)([:]{1})([^/]+) \t viewforum.php?name=$1&$2=$4&%3 [L] 
첫 번째 매개 변수 만 사용하여 반으로 작동합니다. 감사합니다. –

+0

FedericoBiccheddu, 나는 더 많은 설명을 덧붙였다. 이게 도움이 되길 바란다. 나는 당신의 URL이'/'이 아닌'_'을 사용한다는 것을 안다. 그러나 약간 다른 정규 표현식을 사용한다면 개념은 잘 작동 할 것이다. – bmb

관련 문제