2011-10-27 43 views
1

我有一個.htaccess文件,如果滿足某些條件,它會調用perl腳本。 htaccess的文件是這樣的:如何從perl腳本傳遞自定義404錯誤?

Options +FollowSymlinks 
ErrorDocument 404 /404.shtml 

#check existence 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{PATH_INFO} (.*) 

#redirect for codes 
RewriteCond %{REQUEST_URI} !\.[css|jpg|gif|png] 
RewriteRule ^(.*) /cgi-bin/normalized\.pl?code=$1 [R=301] 

代碼獲得通過的normalized.pl文件,例如,如果URL請求的是www.domain.com/code1,「代碼1」將被傳遞。如果代碼存在,我可以將用戶引導至正確的頁面。

但是,如果代碼不存在,我希望用戶定向到我的自定義404頁面,如htaccess文件中定義的。

雖然是什麼似乎發生的事情是,htaccess文件看到規範化的PL作爲一個現有的文件,我得到了一個200響應的Perl腳本。 perl腳本然後返回404頭(如下所示),但它不顯示我的自定義404頁面 - 只是一個瀏覽器標準的頁面。

print header(-status=>'404 Not Found',-type=>'text/html'); 

我懷疑這是因爲.htaccess文件已被perl腳本運行時傳遞。

我該如何說服我的瀏覽器在這種情況下顯示自定義404頁面?強制301從Perl腳本重定向到404頁面是可取的/可接受的嗎?但是這會對索引頁面的搜索引擎有什麼影響嗎?

+0

確定嗎?某些瀏覽器(包括IE和Chrome)將顯示其內置的錯誤頁面,而不是在某些情況下由服務器發送的內容。 http://support.microsoft.com/kb/q218155 – ephemient

+0

如果.htaccess文件在其任務過程中遇到丟失的文件,它將顯示自定義404.只有在調用normalized.pl文件後,404頁無法顯示,這導致我相信它一次都沒有顯示.htaccess已將我傳遞給perl腳本。 –

+0

再次,你確定嗎?忽視瀏覽器顯示的內容,使用像骨幹HTTP客戶端庫(例如[lwp-request](http://search.cpan.org/perldoc?lwp-request))或包嗅探器的更低級別的工具(例如Wireshark),以便以純粹的方式查看響應。 – daxim

回答

1

您的Perl腳本發送的404頭只會告訴瀏覽器該頁面未找到。沒有辦法告訴Web服務器,因爲Web服務器認爲請求是成功的,因爲它發現了你的Perl腳本。

在這一點上發送自定義404頁面的唯一方法是在404頁眉之後爲它提供Perl腳本print

+0

「讓Perl腳本讀取它的內容並將其打印出來」 - 他的自定義404頁面是shtml,所以我猜測它不會像他想的那樣工作。 – AmbroseChapel

+0

@AmbroseChapel如果他在頁面中使用了任何SSI指令,則需要進行一些調整。我會編輯答案,使其更一般。 – MVS