RewriteRule и счетчик загрузки php - PullRequest
0 голосов
/ 13 мая 2010

(1) У меня есть сайт, который обслуживает файлы MP3:

http://domain/files/1234567890.mp3

(2) У меня есть php-скрипт, который отслеживает количество скачиваний файлов:

http://domain/modules/download_counter.php?file=/files/1234567890.mp3

После того, как download_counter.php записывает загрузку, он перенаправляет в исходный файл: Заголовок ("Location: $ FQDN_url");

(3) Я бы хотел, чтобы все мои публичные ссылки были представлены в виде прямых файловых ссылок из (1). Я пытаюсь использовать Apache для перенаправления запросов на download_counter.php:

RewriteRule ^files/(.+\.mp3)$ /modules/download_counter.php?file=/files/$1 [L]

В настоящее время я застрял в (3), так как это приводит к циклу перенаправления, поскольку download_counter.php просто перенаправляет запрос обратно в исходный файл (вместо потоковой передачи содержимого файла).

У меня также есть мотивация использовать download_counter.php как есть (без изменения поведения перенаправления). Это связано с тем, что скрипт является частью более крупного модуля CMS, и я хотел бы избежать усложнения моего пути обновления.

Возможно, нет решения моей проблемы (кроме изменения скрипта download_counter). WDYT

Ответы [ 4 ]

1 голос
/ 14 мая 2010

Если это не самая надежная защита из всех (как я вижу, это не так), тогда просто попросите ваш скрипт перенаправить браузер не в файл, а в

http://domain/files/1234567890.mp3/redirected

Убедитесь, что ваш веб-сервер по-прежнему будет правильно обрабатывать такой запрос при загрузке файла. Если это так, то просто добавьте отрицательный RewriteCond, который обеспечит перенаправление, если и только если ссылка не заканчивается на / redirected

1 голос
/ 14 мая 2010

ОБНОВЛЕННЫЙ ОТВЕТ

Я думаю, у вас много неприятностей, потому что ваш псевдо-URL - это настоящие URL-адреса: они ведут к файлу.Поэтому вы должны изменить свой псевдо-URL на что-то вроде domain.com/downloads/file.mp3, а затем просто проверить, не существует ли запрошенный файл, чтобы перенаправление не зацикливалось.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^downloads/(.+\.mp3)$ /modules/download_counter.php?file=/files/$1 [L]
0 голосов
/ 19 октября 2018

Вставить http://domain/files/ этот .htaccess файл ...

RewriteEngine On
RewriteOptions Inherit
RewriteRule ^(.*).(mp3)$ /modules/download_counter.php?file=$1.$2 [R,L]

Это должно сработать ...

0 голосов
/ 13 мая 2010

Сначала я подумал, что что-то, что будет использовать реферер, будет работать:

RewriteCond %{HTTP_REFERER} !download_conter\.php
RewriteCond %{HTTP_REFERER} !=""
RewriteRule ^files/(.+\.mp3)$ /modules/download_counter.php?file=/files/$1 [L]

Однако браузер не взаимодействует. Допустим, вы щелкаете по какой-то ссылке в file.html на нечто .mp3, а затем пересылаетесь в download_counter.php. Когда скрипт php выполняет пересылку, он устанавливает в качестве реферера не download_counter.php, а file.html.

Единственный способ, которым я вижу, что вы могли бы сделать это, это использовать внешнюю программу перезаписи, которая сохранит некоторое состояние - при первом запросе пользователем файла он сохранит эту информацию и сделает перезапись, во второй раз он узнает это сделало переписывание в первую очередь и будет проходить через запрос без изменений. См. Документацию RewriteMap .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...