基于浏览器语言的404页面用mod_rewrite如何

时间:2010-01-14 00:24:07

标签: apache mod-rewrite http-status-code-404

我试图通过评估客户端HTTP Accept-Language标头,纯粹基于Apache mod_rewrite规则生成依赖于语言的404(也是其他错误)页面。我已设法使用此规则显示正确的页面(英文默认):

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%确定它是否真的值得SEO明智,因为它可能最好不要有404s,但我认为它会更合乎逻辑并保持日志一致等,但我根本无法想象如何通过apache和HTTP实现这一点:Accept-Language。

任何评论都会受到赞赏。

3 个答案:

答案 0 :(得分: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标题,错误页面也用正确的语言。

答案 1 :(得分:2)

Pekka先前的回答完成了这项工作。我在此处提供完整代码供参考,因为它不适合评论。

我从未假设即使404文档指令也可以重写。只是为了澄清其他任何人......“parseme.php”文件甚至不需要存在,因为它应该通过重写重定向到。不确定,但只有当指令位于virtualhost root而不是top目录时,它似乎才适用于我的情况。 最终代码为我工作如下:

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]

答案 2 :(得分:0)

你不能像你一样解释Accept-Language header field。它不仅仅是一个值,而是一个加权值列表。

你应该更好地与PHP进行语言协商,因为mod_rewrite太有限了。