Я наконец нашел способ обойти эту проблему.
Хотя в RFC 2183 показано, что параметр имени файла можно использовать как для вложения, так и для строки в поле заголовка Content-Disposition, кажется, что браузеры игнорируют параметр имени файла при использовании inline, а вместо этого пытаются выяснить, что имя файла должно основываться на URL. Если в URL нет строки запроса, то часть URL, которая следует за последней /, кажется, используется в качестве имени файла.
Я изменил ссылки, которые загружают защищенные документы PDF, чтобы использовать красивые URL-адреса, которые не содержат строку запроса, и использую mod_rewrite с файлом .htaccess, чтобы преобразовать эти красивые URL-адреса для выполнения правильного сценария с правильными параметрами:
Старая ссылка:
index.php?page=secure-area/download&file=document.pdf
Новая ссылка:
file/secure-area/download/document.pdf
.htaccess:
RewriteEngine On
RewriteRule ^file/secure-area/download/(.*)$ index.php?page=secure-area/download&file=$1 [L]
Сценарий, используемый для фактической отправки файла, такой же, как я использовал ранее (обратите внимание, что в примере в вопросе используется Content-Disposition: attachment, а не Content-Disposition: inline, чтобы продемонстрировать браузерам сохранение документа с правильным именем файла при не встроенный).
// check security, get filename from request, prefix document download directory and check for file existance then...
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="' . basename($file) . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Connection: Close');
set_time_limit(0);
readfile($file);
Теперь документ PDF открывается в браузере, и при сохранении имя файла по умолчанию
document.pdf
а не
http___example.com_index.php_page=secure_area_download&file=document.pdf
IE 7 преобразует пробелы в имени файла в + и одиночные кавычки в% 27 при сохранении (Firefox не делает), я бы хотел, чтобы это не происходило, но пока я доволен тем, что у меня есть есть.