2009-04-07 3 views
1

내가 mod_rewrite를 상당히 새로운 그리고 난mod_rewrite에서 재귀 적 대체를 만드는 방법은 무엇입니까?

http://example.com/stuff/foo_bar_blah_etc.html 

http://example.com/foo/bar/blah/etc.html 

에서 URL 변환을 시도하고 가정은 도메인과 사이 디렉토리의 설정 번호가없는 것입니다 파일 이름 따라서 나는 3 개의 자리 표시자를 가진 하나의 다시 쓰기 규칙을 작성할 수 없습니다. 5 ~ 6 개의 규칙을 5 ~ 5 개의 자리 표시자를 사용하여 만들 수 있지만 더 좋은 방법이 있다고 생각합니다. 누군가 이걸로 나를 도울 수 있습니까?

답변

1

이 시도 :

RewriteRule (.*)/(.+) $1_$2 [NS] 
RewriteRule (.*) stuff/$1 [NS] 
+0

빠른 응답을 보내 주셔서 감사합니다. 일단 시험 할 수있는 기회가 생기면 나는 당신의 대답을 받아 들일 것입니다. – martinatime

+0

원래 게시 한 것이 작동하지 않는 것 같습니다. 나는 테스트가 더 기능적으로 보이는 것을 편집했다. – chaos

+0

첫 번째 줄의 플래그에 [N]을 사용하려고 한 것 같습니다. – martinatime

4

을 당신이 밑줄로 한 번에 하나의 슬래시를 대체하기 위해이 작업을 수행 할 수 있다고 생각 :

RewriteRule ^/(.+)/(.*?)$ /$1_$2 [N] 
RewriteRule ^.*$ /stuff$0 

[N] 플래그에서 프로세스를 재 작성 URL을 다시 시작 아파치 원인 첫 번째 규칙. 이 둘 이전의 URL에 적용되는 다른 규칙이있는 경우 모든 반복에서 URL이 호출된다는 점을 기억하십시오.

더 효율적인 방법 일 수도 있고 그렇지 않을 수도있는 대안은 외부 프로그램을 사용하여 다시 쓰기를 처리하는 것입니다. 그것은하지 않습니다 (당신은

RewriteMap slashtouscore prg:/usr/local/bin/slashtouscore.pl 
RewriteRule ^/(.*)$ /stuff${slashtouscore:$1} 

(대신 위의) 아파치 설정 파일에 넣고 것입니다 그리고 당신은 내용

#!/usr/bin/perl 
$| = 1; 
while (<>) { 
    s|/|_|g; 
    print; 
} 

으로 실행 스크립트 /usr/local/bin/slashtouscore.pl를 작성해야 것 Perl 스크립트 여야합니다. 물론 동일한 기능을 가진 모든 프로그램이 할 것입니다. 물론 아파치가 액세스 할 수있는 한 파일 이름은 원하는대로 지정할 수 있습니다.

아무 것도 테스트하지 않았 음에 유의하십시오.

+0

철저한 답변 주셔서 감사합니다. – martinatime

관련 문제