Я согласен, что POST является правильным методом HTTP в этом случае, когда клиентский запрос содержит параметры, которые приводят к созданию файла на сервере.Помимо того, что это хорошая практика, проблема с предварительной загрузкой браузера, с которой вы связались, является хорошим предупреждением о том, что может пойти не так (с тех пор Google отменил эту «функцию»).
Но, если вы собираетесьВперед с GET вместо переписывания с использованием POST, я дам несколько советов.
Что касается сканирования поисковых систем, это законная проблема.В последнее время я много работал со стандартом исключения роботов, и, по моему опыту, это хорошо соблюдаемый стандарт, которому следуют все законные сканеры, такие как поисковые системы.На данный момент ему более 15 лет, в основном без изменений, с очень простым синтаксисом.Хотя Google и компания сканируют все больше и больше вещей (новые типы файлов, внутри поисковых форм), я не могу себе представить, что они не подчиняются явному правилу Disallow
.В любом случае, обязательно внедрите и протестируйте файл robots.txt для этих шаблонов URL, и это должно решить проблему поисковой системы.
Я не знаю, открываются ли эти URL-адреса пользователю каким-либо образом (адрес браузерапанель, ссылка на веб-страницу, которую они могут щелкнуть правой кнопкой мыши) или просто часть HTTP-трафика - но если это только последнее, вам не о чем беспокоиться.Глубокие URL-адреса, подобные этим, обычно индексируются, если они не переходят по ссылкам на вашем сайте, когда пользователи делятся ссылками по электронной почте, в Твиттере и т. Д. Если кто-то пишет в Твиттере ссылку и сканирует ее робот Google, Google подчиняется роботам.txt, а не индексировать его, но для вас все еще может быть проблема, что его можно найти в Twitter.Поэтому, насколько это возможно, заставляйте любые чувствительные URL работать только в фоновом режиме (я уверен, что 99,9% ваших пользователей не потрудятся прослушивать TCP, чтобы получить URL для обмена).
Что касается смягчения последствийдругие проблемы с GET, я бы предложил использовать nonce как часть вашего GET URL вместе с ключом сеанса.Это довольно стандартная вещь в веб-приложениях для защиты от CSRF, и она сделает эти GET-URL доступными для использования только один раз клиентским сеансом (если это слишком ограничительно, вы можете сделать их доступными для сеанса дольше ... используйте времяна основе хэша вместо одноразового номера).Когда срок действия одноразового номера истек, верните перенаправление 404 или 30X.
Еще можно сделать, вместо того, чтобы CGI возвращал поток файлов .mp3 напрямую, чтобы он перенаправил HTTP на второй URL, которыйвозвращает файл.В зависимости от того, хотите ли вы, чтобы этот второй URL был «общедоступным», вы можете использовать постоянный (301) или временный (302/303) код ответа.Поисковые системы не будут индексировать исходный URL-адрес GET, так как это приведет к перенаправлению и не будет сохраняться в адресной строке браузера для копирования / вставки пользователем.
Гарантия того, что эти URL-адреса являются однократнымитолько один сеанс решит проблемы безопасности / загрузки.Единственное исключение, о котором я могу подумать, - это случай предварительной выборки в браузере.
При предварительной выборке ... спецификации HTML переходят к выборочной предварительной выборке ссылок с type="prefetch"
(в настоящее время *)1021 * выполняет это в теге link
, но нет эквивалента, указывающего, что тег a
может / должен быть предварительно выбран), а не в поведении «предварительная выборка по умолчанию для всего».Связанная проблема заключается в том, что предварительная выборка также может производиться прокси-серверами (например, Squid офисной сети или мобильными браузерами, такими как Opera Mini, которые используют прокси-сервер для получения и повторного сжатия изображений), но я не знаю ни одного, который в настоящее времясделай это.Итак, я не думаю, что у вас есть что-то, что действительно беспокоит вас в этой области, но если вы хотите быть параноиком по этому поводу, выход состоит в том, чтобы следовать правилам и просто использовать POST при изменении состояния сервера.