我有一個.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頁面是可取的/可接受的嗎?但是這會對索引頁面的搜索引擎有什麼影響嗎?
確定嗎?某些瀏覽器(包括IE和Chrome)將顯示其內置的錯誤頁面,而不是在某些情況下由服務器發送的內容。 http://support.microsoft.com/kb/q218155 – ephemient
如果.htaccess文件在其任務過程中遇到丟失的文件,它將顯示自定義404.只有在調用normalized.pl文件後,404頁無法顯示,這導致我相信它一次都沒有顯示.htaccess已將我傳遞給perl腳本。 –
再次,你確定嗎?忽視瀏覽器顯示的內容,使用像骨幹HTTP客戶端庫(例如[lwp-request](http://search.cpan.org/perldoc?lwp-request))或包嗅探器的更低級別的工具(例如Wireshark),以便以純粹的方式查看響應。 – daxim