2014-10-25 5 views
1

나는 아주 간단한 URL 재 작성 규칙을 가지고 : http://mywebsite.com/test/http://example.com 다음 쿼리 매개 변수로이 script.php에 http://example.com를 보내둘 이상의 백 슬래시가 있으면 다시 쓰기가 자동으로 제거됩니까?

RewriteEngine on 

RewriteCond %{HTTP_HOST} !script.php 
RewriteRule ^test/(.*) script.php?q=$1 

아이디어는 URL을 이런 종류의 것입니다. 문제는 http://example.com 대신 http:/example.com이 수신된다는 것입니다. 또한 http:////example.comhttp:/example.com으로 전송됩니다. 이 문제의 원인은 무엇입니까?

+1

한다 RewriteCond %가 {HTTP_HOST} script.php'이 조금에 이해되지 않는다'주의하시기 바랍니다. '% {HTTP_HOST}'는 url의 호스트 명입니다. 예를 들어 위의 예제에서'mywebsite.com'이거나 웹 사이트에'http : // 127.0.0.1/aasdf '를 요청하면'127.0.0.1'입니다. 게다가 두 번째 인수는 정규 표현식입니다. 정규식의 점은 리터럴 점을 포함하여 많은 문자와 일치합니다. 문자 그대로의 점과 일치하는 것을 의미한다면 그것을 탈출하십시오! ('! script \ .php') – Sumurai8

+0

맞아요, 그래서 어떻게 전체 URL을 일치시킬 수 있을까요? – Zed

+0

'script.php'가'^ test /(.*)'와 일치하지 않기 때문에 조건은 필요 없습니다. 어떤 이유에서 RewriteRule의 첫 번째 인수와 일치하는 것을 제외해야하는 경우 일반적으로'RewriteCond % {REQUEST_URI}! ^/script \ .php $'와 같은 것을 사용합니다. 규칙을 통해 다양한주기를 통해 내부적으로 다시 쓰여지는 것이 아니라 들어오는대로 요청을 일치시켜야하는 경우'% {THE_REQUEST} '와 (과) 일치시킬 수 있습니다. 이것은 정기적 인 재 작성이 아닌 무한 재 작성에서 고생하는 상황에서 유용 할 수 있습니다. – Sumurai8

답변

0

아파치 mod_rewrite 엔진 RewriteRule 지시어에 패턴 매칭을위한 단일 /에 여러 ///... 변환한다. 그러나 RewriteCond을 사용하여 일치하는 경우 을 복수/과 일치시킬 수 있습니다.

이 같은 규칙을 사용할 수 있습니다!

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_URI} ^/+test/+(https?://.+)$ [NC] 
RewriteRule^script.php?q=%1 [L,QSA] 
0

브라우저에서이 동작이 발생합니다. /의 시퀀스를 1 /으로 압축합니다.이 시퀀스는 여전히 본질적으로 경로이기 때문입니다. /////은 우리가있는 디렉토리를 변경하지 않으므로 /을 사용할 수 있습니다.

  • 대신 쿼리 문자열을 사용하도록 링크를 변경

    :

    당신은 두 가지 옵션이 있습니다. test/?q=somethingscript.php?q=something으로 다시 작성하면 모든 것이 예상대로 작동합니다. 당신은 다음을 수행합니다 :

    RewriteRule ^test/?$ script.php [L] 
    

    쿼리 문자열을 변경하지 않기 때문에, 원래의 쿼리 문자열이 자동으로 새 쿼리 문자열에 복사됩니다.

  • 발생하는 슬래시 수를 가정하지 마십시오. URL은 브라우저의 URL 막대에서 올바르게 표시되지 않을 수 있지만 리디렉션 인 경우 매우 짧은 시간 동안 만 볼 수 있습니다.

    RewriteRule ^test/(http|https):/+(.*)$ script.php?q=$1://$2 
    
관련 문제