2011-04-18 40 views
1

我有一個非常奇怪的現象,而使用梅森,例如:梅森和Apache的配置,加載文件不存在

我有一個index.html文件(包含像<% $var %> hello石匠標籤)。

當我瀏覽到http://bla.com/index.html時,變量在編譯期間被轉換。

但是當我瀏覽到http://bla.com/index時有一種奇怪的行爲。

儘管有(僅index.html)呼籲index沒有文件仍然加載index.html和整個代碼顯示爲純/文本包括<% ... %>

我配置錯了什麼?

這是我的Apache配置:

<VirtualHost *:80> 
     ServerAdmin [email protected] 
     ServerAlias abc.com www.abc.com 
     ServerName abc.com 


     DocumentRoot /var/www/abc.com 
     DirectoryIndex index.html 

     <Directory "/var/www/abc.com/"> 
       Options FollowSymLinks MultiViews 
       AllowOverride All 

       Order allow,deny 
       allow from all 
     </Directory> 

     SetHandler perl-script 
     PerlModule HTML::Mason::ApacheHandler 
     PerlSetVar MasonUseObjectFiles 1 

     <LocationMatch "(\.html|\.txt|\.pl|\.js)$"> 
       SetHandler perl-script 
       PerlHandler HTML::Mason::ApacheHandler 
     </LocationMatch> 

     <LocationMatch "(\.m(html|txt|pl)|dhandler|autohandler)$"> 
       SetHandler perl-script 
       PerlHandler Apache::Constants::NOT_FOUND 
     </LocationMatch> 

回答

2

了〜一年,我意外地找到了答案後,所以我想分享我的發現:

的問題是,梅森(Perl中)在網頁上顯示的代碼本身的另一個文件,而不是提供「404文件沒有找到「,我不知道如何阻止它。例如:請求索引時它顯示的index.html的代碼

的解決方案是,在我的Apache配置有以下內容:

<Directory "/var/www/my_dir/"> 
       Options FollowSymLinks MultiViews 
       AllowOverride All 

       Order allow,deny 
       allow from all 
     </Directory> 

顯然「多視圖」是通過mod_negotiation.c激活,這導致該網站在服務器上找不到該文件的情況下搜索次最佳匹配的模式。 (所以從www.site.com/index它找到了index.html)

但是因爲在Apache中沒有配置來執行Mason ENV中的索引(沒有文件擴展名),它只是顯示代碼...

搞笑:)但解決方案是將「Options FollowSymLinks MultiViews」更改爲「Options FollowSymLinks -MultiViews」,而不使用MultiView。

發現這個解決方案,同時看到下面的響應頭:

Content-Location index.html 
Vary negotiate 

的「多視圖」沒有任何意義對我來說,因爲它是從5年前一個複製粘貼,我只是進行從一個網絡服務器到另一個:)

謝謝, 裏奇。

0

爲什麼Web服務器自動地

  1. 轉換索引的index.html
  2. 上把它依然堅持專(它顯然不不應該把它餵給PerlHandler,因爲它應該)我真的不知道(也許答案是在你的配置中的其他地方)。

但是,你可以作爲一個解決方法嘗試添加'index'(或者更確切地說'^ index')到正則表達式,該正則表達式應該將什麼文件分解到HTML::Mason::ApacheHandler。我承認這雖然有點難看。

我糾正一旦你加載index頁面並獲得顯示的逐字代碼,一旦你檢出頁面信息,編碼是從字面上plain/text?也許你需要配置一些MIME設置,以確保沒有後綴的文件(文件不以.html等結尾)根本不會發送到遠程瀏覽器,甚至不是plain/text

+0

嘿,謝謝你的回答,雖然我不想將每個文件添加到REGEX(這是一個安全漏洞,一旦我忘記添加不同的文件) – 2011-04-18 14:45:41

+0

平原/文本的mime不打擾我,因爲它不是假設加載它在第一個地方... Web服務器像添加它自己的「.html」在後臺或其他東西,因爲它發生在目錄中的每個文件... – 2011-04-18 14:46:43

+1

嗯,我覺得我太耐心了當我跳槍並提供了上述答案時。 (我很想投我自己的答案...)。爲了理解你的Web服務器的行爲:如果你調用一個文件foo.html,那麼當你提供URL「http:/」時,這個文件是否也會被逐字檢索(用mime類型的'plain/text') /bla.com/foo「? – IllvilJa 2011-04-18 18:59:29