Назад | Перейти на главную страницу

Apache Mod-Rewrite: почему этот URL не фильтруется

Я хотел бы запретить iPad подключаться к моему серверу и разрешить только iPhone. Что не так с этим скриптом mod_rewrite, который позволяет это?

#Prevent non-iPhones from connecting to the server.
#RewriteCond %{HTTP_USER_AGENT} !.*Apple-iPhone2C1.* [NC]
#RewriteCond %{HTTP_USER_AGENT} !.*Apple-iPhone3C1.* [NC]
#RewriteRule () http://www.xyz.com/ [R,NC,L]



#The next line prevents version 4.0
RewriteCond %{HTTP_USER_AGENT} .*801.293.* [NC]

#The next line prevents version 3.13
RewriteCond %{HTTP_USER_AGENT} .*705.18.* [NC]

#The next line prevents version 3.21
RewriteCond %{HTTP_USER_AGENT} .*702.405.* [NC]

#The next line prevents version 3.2
RewriteCond %{HTTP_USER_AGENT} .*702.367.* [NC]

#Require iPhones to be 3GS or iPhone 4.
RewriteCond %{HTTP_USER_AGENT} !.*Apple-iPhone2C1.* [NC]
RewriteCond %{HTTP_USER_AGENT} !.*Apple-iPhone3C1.* [NC]

На устройстве-нарушителе есть это для пользовательского агента:

 Apple-iPad1C1/803.148 

В RewriteCond условия применяются по умолчанию с использованием логического И, и вам нужно использовать ИЛИ поскольку вы указываете, какие версии блокировать, а не какие версии разрешить:

#The next line prevents version 4.0
RewriteCond %{HTTP_USER_AGENT} .*801.293.* [NC,OR]

#The next line prevents version 3.13
RewriteCond %{HTTP_USER_AGENT} .*705.18.* [NC,OR]

#The next line prevents version 3.21
RewriteCond %{HTTP_USER_AGENT} .*702.405.* [NC,OR]

#The next line prevents version 3.2
RewriteCond %{HTTP_USER_AGENT} .*702.367.* [NC,OR]

#Require iPhones to be 3GS or iPhone 4.
RewriteCond %{HTTP_USER_AGENT} !.*Apple-iPhone2C1.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !.*Apple-iPhone3C1.* [NC,OR]

RewriteRule .* http://destination.example.com/ [R,NC,L]

Я думаю, вам не хватает RewriteRule

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

Описание содержимого, зависящее от браузера:

По крайней мере, для важных страниц верхнего уровня иногда необходимо обеспечить оптимальный контент, зависящий от браузера, т.е. нужно предоставить максимальную версию для последних вариантов Netscape, минимальную версию для браузеров Lynx и среднюю версию функций для всех остальных. .

Решение: мы не можем использовать согласование контента, потому что браузеры не предоставляют свой тип в этой форме. Вместо этого мы должны работать с HTTP-заголовком «User-Agent». Следующий condig делает следующее: Если HTTP-заголовок «User-Agent» начинается с «Mozilla / 3», страница foo.html перезаписывается на foo.NS.html и перезапись останавливается. Если используется браузер «Lynx» или «Mozilla» версии 1 или 2, URL-адрес становится foo.20.html. Все остальные браузеры получают страницу foo.32.html. Это делается по следующему набору правил:

RewriteCond %{HTTP_USER_AGENT}  ^Mozilla/3.*
RewriteRule ^foo\.html$         foo.NS.html          [L]

RewriteCond %{HTTP_USER_AGENT}  ^Lynx/.*         [OR]
RewriteCond %{HTTP_USER_AGENT}  ^Mozilla/[12].*
RewriteRule ^foo\.html$         foo.20.html          [L]

RewriteRule ^foo\.html$         foo.32.html          [L]