2010-01-14 65 views
3

我想通過評估客戶端HTTP接受語言頭來生成純粹基於Apache mod_rewrite規則的語言依賴404(也是其他錯誤)頁面。我已經成功地顯示正確的頁面(默認的英文)這個規則:基於瀏覽器語言的404頁與mod_rewrite如何

RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{HTTP:Accept-Language} ^es [NC] 
RewriteRule (.+) /esp/error404.php [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteRule (.+) /eng/error404.php [L] 

我的問題是,我想保持的404錯誤,我知道重定向不允許這種類型的標誌。我在任何情況下都不能100%確定它是否真的值得搜索引擎優化,因爲它可能最好沒有404s,但我認爲它會更合理,並保持日誌一致等,但我根本無法確定如何通過apache和HTTP實現:Accept-Language。

任何意見將主要讚賞。

回答

4

您可以使用Apache的默認錯誤處理程序來執行此操作。

應該可以定義像這樣的的ErrorDocument:

ErrorDocument 404 /parseme.php 

,然後做請求依賴於語言的重定向到/parseme.php像這樣:

RewriteCond %{REQUEST_FILENAME} ^/parseme\.php$ 
RewriteCond %{HTTP:Accept-Language} ^es [NC] 
RewriteRule (.+) /esp/error404.php [L] 

RewriteCond %{REQUEST_FILENAME} ^/parseme\.php$ 
RewriteCond %{HTTP:Accept-Language} ^eng [NC] 
RewriteRule (.+) /eng/error404.php [L] 

我從來沒有試過,但這應該給你一個404頭,並在正確的語言的錯誤頁面。

+0

謝謝。工作很好,看到自己的答案吼聲。 – luison 2010-01-14 10:39:21

+0

在vhost配置以及.htaccess文件中都可以做到這一點嗎? – 2011-05-12 11:58:47

+0

@ mr-euro是的。儘管絕對路徑'/ eng/error404.php'可能是相對於根目錄的,我不確定 – 2011-05-12 15:05:54

0

你不能像你那樣解釋Accept-Language header field。它不只是一個單一的值,而是一個加權值列表。

您應該更好地使用PHP進行語言協商,因爲mod_rewrite太侷限了。

+0

謝謝,但是語言邏輯運行良好,這是我遇到的404問題,確保mod_rewrite很難但功能強大足夠。 – luison 2010-01-14 10:30:43

+0

@luison:如果您只是測試* Accept-Language *值是否以'es'開頭,那麼您的邏輯確定是不正確的。 – Gumbo 2010-01-14 11:15:11

2

以前Pekka的回答完成了這項工作。我在這裏包含完整的代碼供參考,因爲它不適合評論。

我從來沒有假設即使404文檔指令可以重寫。只是爲了澄清其他人...「parseme.php」文件甚至不需要存在,因爲它應該被重定向到通過重寫。不知道,但它似乎工作在我的情況下,只有當指令是在虛擬主機根目錄而不是頂級目錄。 爲我工作的最終代碼如下:

ErrorDocument 404 /error_404.php 

RewriteEngine on 
# If spanish... use spanish error page 
RewriteCond %{REQUEST_FILENAME} ^/error_404\.php$ 
RewriteCond %{HTTP:Accept-Language} ^es [NC] 
RewriteRule (.+) /esp/error404.php [L] 

# If previous did not match - any language (note [L] flag on previous rule) use english 
RewriteCond %{REQUEST_FILENAME} ^/error_404\.php$ 
RewriteRule (.+) /eng/error404.php [L] 
+0

「......只有當指令處於虛擬主機根目錄而不是頂級目錄時......」是否這意味着這在.htaccess文件中不起作用,但僅在Apache vhost配置中有效? – 2011-05-12 11:57:42

+0

不,但我從來沒有在htaccess中試過它 – luison 2011-05-26 14:52:23