2011-07-18 85 views
2

因此,我正在構建一個需要重定向的應用程序(或者它是否需要重寫?我需要做一個URL在客戶端保持不變)複製到.php文件中,以查看我的Web服務器(Apache)上給定目錄中.pdf文件發生的所有請求。但是,如果用戶試圖在瀏覽器中顯示PDF(不下載它),我只希望重寫此請求。我有一種感覺,第二部分是不可能的。重定向(重寫?)Apache服務器上的所有.PDF請求到.php文件

有沒有人有一些很好的資源來研究,不僅描述我將需要使用的語法,而且還描​​述了Apache服務器幕後發生的事情?

此外,有沒有人有一個想法,我如何可以確定文件是否直接下載或通過網絡瀏覽器請求?我有一種感覺,因爲當你通過瀏覽器訪問PDF文件時,它似乎下載它並使用Adobe Reader插件顯示它,這兩者之間沒有區別。

最好的問候,

回答

4
<IfModule mod_rewrite.c> 
    Options +FollowSymLinks 
    Options +Indexes 
    RewriteEngine On 

    # only if not an actual file exist 
    RewriteCond %{REQUEST_FILENAME} !-f 

    # only if not an actual directory exist 
    RewriteCond %{REQUEST_FILENAME} !-d 

    RewriteRule /your-directory/path/(.+)\.pdf $1.php [NC,L] 
</IfModule> 

1.正在改寫。

2.查看和下載沒有區別。如果您的Apache服務器收到請求,它會給出響應。響應將會是你的PHP腳本將輸出的任何內容。更新:@corretge給了你一個與此相關的答案。我認爲依賴客戶端發送的頭文件並不是完全可靠的,但您可以嘗試該解決方案。

3.在這裏,您可以瞭解Apache's mode_rewrite

+0

如果OP完全複製您的代碼,他將有服務器錯誤。註釋不能在行中間開始。如果** first **非空白字符是'#',則整行被視爲註釋。在所有其他情況下,它將被視爲指令的一部分:http://httpd.apache.org/docs/current/configuring.html#syntax – LazyOne

+0

@LazyOne:謝謝!放置在那裏作爲解釋,但忘記告訴OP刪除它們。 – Shef

2

沒有測試,但你也可以試試:

RewriteRule ^(.+)\.pdf$ /downloadPdf.php?pdf=$1.pdf [L,NC,QSA] 

而且在與headers_list()如果任何HTTP標頭/downloadPdf.php腳本查詢這些都存在:

header("Content-Type: application/force-download"); 
header("Content-Type: application/download"); 

如果下載頭都存在,發送文件,

header("Content-Disposition: attachment; filename=\"" . stripslashes($this->ubqDoc[$this->camp]['name']) . "\""); 

並強制下載標題。

否則,與此頭

header("Content-Disposition: inline; filename=" . stripslashes($this->ubqDoc[$this->camp]['name'])); 

您需要管理其他標題,如:Content-Type和內容Lenght

閱讀fpassthru PHP手冊關於從PHP發送文件發送文件。

+0

感謝您的意見。雖然這裏的信息絕對有用,但其他答案更直接地回答我的問題。 – MoarCodePlz

+0

別擔心,但我很好奇:如果PDF是強制下載的,或者如果在瀏覽器中顯示,您會收回不同的標題? – corretge

+0

我還沒有測試過,但根據上面的迴應,標題略有不同。我會做一些網絡嗅探並在這裏發佈答案。 – MoarCodePlz

相關問題