를 압축, anubhava의 대답은 나보다 훨씬 낫다. 목록의 순서가 보장되지 않으면 다음 규칙을 사용할 수 있습니다. 그것은 Jon Lin uses in this answer 기술을 사용합니다.
RewriteCond %{QUERY_STRING} ^(.*&|)(?!(phone|fax|zip))[^=]+=
RewriteCond ##%{QUERY_STRING} (.*?)##(|.*&)(phone)=([^&]+)
RewriteCond %1&%3=%4##%{QUERY_STRING} (.*?)##(|.*&)(fax)=([^&]+)
RewriteCond %1&%3=%4##%{QUERY_STRING} (.*?)##(|.*&)(zip)=([^&]+)
RewriteRule ^(.*)$ $1?%3=%4%1 [R,L]
그럼 어떻게해야합니까? 첫 번째 조건은 (phone|fax|zip)
(음수 앞 어서)과 일치하지 않는 매개 변수를 찾을 수있는 경우에만 true입니다. 다음 세 개의 RewriteCond
은 사용자가 ##
구분 기호 앞에 보관하려는 각 매개 변수를 캡처하고 쿼리 문자열을 준비합니다. 구분 기호가 쿼리 문자열에있을 경우 이상한 일이 발생합니다.
이러한 접근법의 단점은 이러한 세 가지 매개 변수 중 하나가 없으면 규칙이 적용되지 않는다는 것입니다. 개인적으로이 화이트리스트를 페이지 자체에 넣고 .htaccess를 통해 필터하려고하지 마십시오. 룩어의 매개 변수와 일치하지 않는 문자열의 매개 변수가 존재하는 경우 것, 기본적으로
RewriteCond %{QUERY_STRING} ^((.*?)&|)(?!(phone|fax|zip))[^=]+=[^&]+(&.*|)$
RewriteRule ^(.*)$ $1?%2%4 [R,E=Redir:1]
RewriteCond %{QUERY_STRING} ^&(.*)$
RewriteRule ^(.*)$ $1?%1 [R,E=Redir:1]
RewriteCond %{ENV:Redir} =1
RewriteRule^- [R,L]
:
편집 : 일부 매개 변수는 선택하면 다음과 같은 괴물을 사용할 수 있습니다 해당 매개 변수와 그 매개 변수 뒤에있는 부분 앞에있는 부분을 일치시키고 쿼리 문자열을 다시 강조하십시오. 두 번째 규칙은 첫 번째 매개 변수가 '허용 목록에 없음'이 아니거나 단순히 &으로 시작하는 경우 전체 쿼리 문자열을 완전히 소모하지 못하도록하고 마지막 규칙은 리디렉션의 양을 최소로 유지하려고하는 것입니다. 허용 목록에없는 매개 변수가 너무 많으면 브라우저에 오류 (리디렉션 체인이 감지 됨)가 표시됩니다.
대신 페이지 자체를 필터링하는 것이 좋습니다.PHP에서는 다음과 같은 코드가 될 것입니다. 이렇게하면 다른 httpdeamon을 사용하기로 결정한 경우이 허용 목록을 쉽게 유지 관리 할 수 있으며 모든 것을 해치지 않습니다.
<?php
$whitelist = Array('phone', 'fax', 'zip');
foreach($_GET as $k => $v) {
if(!in_array($k, $whitelist))
unset($_GET[$k]);
}
#And the same for $_POST and $_REQUEST
모든 매개 변수가없는 경우 방법으로 내 대답을 편집했습니다. 그래도 페이지 자체에서이 작업을 수행하는 것이 좋습니다. – Sumurai8
@Martins : 어제이 문제에 참석할 수 없어 죄송합니다. 나는 이것을하기의 순수한 .htaccess 방법이 또한있을 것이라는 점을 확실하다. 나는 오늘 그것을 시험 할 것이다. – anubhava