我试图通过评估客户端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。
任何评论都会受到赞赏。
答案 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太有限了。