抱歉,這可能是一件容易的事。我想檢查兩者是否匹配。我的標頭和 HTTP_REFERER 的值
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC]
RewriteCond %{HTTP:X-SomeHeader} !somekey
RewriteRule ^ - [F]
否則我想阻止用戶。
標頭檢查效果很好,并且僅在正確時才提供檔案。但是 HTTP_REFERER 似乎被忽略了。甚至在資源不存在時也會提供資源。Fe 卷曲。我如何需要更改兩者必須匹配的條件?
uj5u.com熱心網友回復:
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC] RewriteCond %{HTTP:X-SomeHeader} !somekey RewriteRule ^ - [F]
這目前正在檢查兩者是否不匹配。如果Referer標頭不存在,但somekey已通過,則不會阻止請求。
OR在第一個條件上你需要一個標志。IE。如果其中一個不匹配,則阻止請求。例如:
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC,OR]
RewriteCond %{HTTP:X-SomeHeader} !=somekey
RewriteRule ^ - [F]
您還需要=第二個CondPattern上的運算子進行精確匹配,否則您將檢查是否somekey存在于傳遞的標頭中的任何位置。
或者,反轉邏輯:
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?alloweddomain.com [NC]
RewriteCond %{HTTP:X-SomeHeader} =somekey
RewriteRule ^ - [S=1]
RewriteRule ^ - [F]
如果兩者都匹配,則跳過以下阻止請求的規則。
更新:
但是一個GET引數,你能指導我怎么做嗎?這是我嘗試過的
RewriteCond %{QUERY_STRING} apikey!=somekey
使用該RewriteCond指令,您正在執行(正則運算式)字串比較。QUERY_STRING服務器變數(即)的值%{QUERY_STRING}與字串/正則運算式進行比較apikey!=somekey。這永遠不會匹配,因為您應該檢查 "string" apikey=somekey。( =or !=) 不是比較運算子,它只是字串的一部分。(不要與CondPattern本身(如上所用)否定整個運算式的!前綴運算子混淆。)
要檢查字串“apikey=somekey”是否不包含在任何地方,QUERY_STRING然后使用CondPattern !apikey=somekey。但是,這可能過于寬泛,因為(如前所述)這是檢查字串是否不包含在QUERY_STRING. 表單的查詢字串fooapikey=somekeybar也將成功。您可以改為執行精確的字串比較(如上)。例如:
RewriteCond %{QUERY_STRING} !=apikey=somekey
如果查詢字串只能包含apikeyURL 引數而沒有其他內容,那沒關系,但如果您可能期望同一請求中的其他 URL 引數,例如。foo=1&apikey=somekey&bar=1或者apikey=somekey您需要使用以下形式的正則運算式:
RewriteCond %{QUERY_STRING} !(^|&)apikey=somekey($|&)
當URL 引數(確切字串)不包含在查詢字串中的任何位置時,條件成功。apikey=somekey
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/459228.html
