У меня есть следующий файл .htaccess в моем настраиваемом каталоге в разделе Загрузки под названием client.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !(www.)?example.co.uk/client-area*
RewriteRule ^.*$ - [R=403,L]
ErrorDocument 403 'http://www.example.co.uk/client-area/'

Поэтому, если кто-то пытается получить доступ к файлу в каталоге uploads / client / из любого другого места, кроме страницы клиентской области, он будет перенаправлен.

Однако я хочу проигнорировать это, когда использую при использовании WordPress функцию download_url для доступа к файлу в этом каталоге из functions.php. Есть ли условие перезаписи, которое я могу использовать, чтобы облегчить это?

1
Sinister Beard 11 Апр 2016 в 18:34

2 ответа

Лучший ответ

Если я правильно понимаю, вы вызываете функцию WP download_url и хотите пропустить это правило из 403.

Дело в том, что веб-сервер (Apache) не узнает, идет ли запрос, из-за того, что вы вызываете функцию download_url.

В качестве обходного пути вам нужно будет передать некоторый параметр запроса, чтобы помочь правилам mod_rewrite, но это небезопасный подход, поскольку любой посетитель вашего веб-сайта также может сделать то же самое, передав тот же параметр запроса.

0
anubhava 11 Апр 2016 в 15:59

Вы можете добавить еще один RewriteCond в свойство QUERY_STRING.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !(www.)?example.co.uk/client-area*
RewriteCond %{QUERY_STRING} !^download_url [NC]
RewriteRule ^.*$ - [R=403,L]
ErrorDocument 403 'http://www.example.co.uk/client-area/'

https://wiki.apache.org/httpd/RewriteQueryString

Изменить: Я неправильно понял вопрос. Я думал, вы передаете download_url в URL. Вы можете просто исключить из RewriteRule весь каталог, в котором находятся загружаемые файлы.

Например.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !(www.)?example.co.uk/client-area*
RewriteCond %{REQUEST_URI} !\/wp-content\/uploads\/((\.[^\.])|([a-z0-9\-_\+\/]))+$ [NC]
RewriteRule ^.*$ - [R=403,L]
ErrorDocument 403 'http://www.example.co.uk/client-area/'

Кстати, я бы не стал полагаться на HTTP_REFERER для фильтрации контента, он может быть легко изменен / подделан клиентом. Регулярное выражение в RewriteCond, которое я добавил, будет соответствовать буквам, цифрам, дефисам, подчеркиванию, плюсам и косой черте. В частности, он не будет соответствовать "..". Это сделано для предотвращения доступа относительных URI к другим файлам за пределами wp-content/uploads. (Я думаю , что Apache действительно расширит URI, а затем попытается сопоставить расширенный URI с вашими правилами.)

1
noahnu 11 Апр 2016 в 20:04