2011-05-20 75 views
0

TLDR:我正在尋找一種方法來爲保留MIME類型的文件系統提供網絡資源(css,jpg等)。Php include()正確的MIME類型

我正在創建一個驗證來自另一個域(通過一次性令牌)的用戶的php封裝器,創建一個會話,然後將服務文件,多個網站放在單獨的目錄中,否則在該用戶的可訪問目錄內。

到目前爲止,我已經使用php來處理驗證和mod_rewrite,通過將請求的頁面添加爲get的包裝器來重定向目錄內的任何請求。

問題是,當我打開鏈接到其他資源的網頁時,它會通過每個資源的包裝運行,並且不保留MIME類型。因此格式化會被搞砸。

有沒有人有一個工作或更好的方式來通過PHP腳本從文件系統服務文件。

這裏是我的重定向規則:

<Directory /var/www/ssl/auth> 
    RewriteEngine On 
    RewriteBase /auth 
    RewriteRule ^(.*) /wrapper.php?topage=https://%{SERVER_NAME}/auth/$1 
</Directory> 

,這是包括:(它被選中後,該文件存在)

$path = 'https://'.$_SERVER['SERVER_NAME'].'/'; 
$abs_path=substr($_GET['topage'], strlen($path)); 
include ($abs_path); 

下面是我得到的錯誤(使用開發工具鉻)

Resource interpreted as Stylesheet but transfered with MIME type text/html 

我創建這個,使我的學校的蘋果用戶可以發佈課程網站網站(使用iweb並在內部託管)需要身份驗證,並且從學校的主網站鏈接(外部託管)時無需登錄兩次即可訪問。

西裝堅決要求它設置爲跨域。 如果您有任何對此特定問題的建議或如何實現身份驗證。跨域讓我知道。

解決方案

Tandu。感謝您使用您制定的概念提供的幫助,我能夠使用堆棧溢出來解決我的問題,這裏是解決方案。我<,發現如何獲得MIME類型,然後我使用header()作爲一種魅力傳播它。

$path = $proto.$_SERVER['SERVER_NAME'].'/'; 
$abs_path=substr($_GET['topage'], strlen($path)); 
$type = (get_object_vars(apache_lookup_uri("$abs_path"))); 
header('Content-type: '.$type['content_type']);  
readfile($abs_path); 

希望這可以幫助別人。

回答

1

嗯,我不確定我是否可以回答你的問題,但Chrome中的問題是你的服務器發送的文件是錯誤的MIME類型(顯然)。您需要更新您的服務器設置才能爲css,js等文件發送正確的MIME類型。很難猜測mss類型是否爲css,js等,因爲它們沒有將mime信息存儲在文件頭中,而是您必須猜測。您可以配置apache以使用mime.types基於擴展名設置MIME類型。

+0

沒錯。我明白你的意思。如果它只是由apache2提供服務,但每個文件都由php進行預處理(使用include()),然後輸出由Apache提供服務,這將起作用。我如何'include()'並保留MIME類型。 – 2011-05-20 05:07:45

+1

這取決於。如果你只是'include()'一個文件,那麼你可以根據其擴展名在php中設置頭文件(帶有'header()')。如果你包含()多個文件(爲什麼?),那麼你不能這樣做。 – 2011-05-20 12:34:59

+0

當我調用一個.html文件時,它會調用資源,所有這些資源都會通過php包裝器重定向。每次腳本執行時,只需要包含一件東西,但我需要它來保留MIME類型。我是一名新用戶,因此我無法回答自己的問題,但我編輯了問題的解決方案。 – 2011-05-20 14:41:19