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

我试图通过评估客户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错误,我明白redirect不允许这种types的标志。 我在任何情况下都不是100%确定是否真的值得search引擎优化明智,因为它可能最好没有404s,但我认为这将更符合逻辑和维护日志一致等,但我根本无法如何通过apache和HTTP实现:Accept-Language。

任何意见将主要赞赏。

Wampserver图标不会完全绿色,MySQL服务不启动?

PHP的乐趣与Apache 500错误

将非www和非httpsredirect到https:// www

htaccess密码保护,但不在本地主机上

Python CGI可执行脚本下载/显示脚本代码

Restler API框架安装

Python 3.4导致Apache2服务器(Mac)上的UnicodeEncodeError,但在命令行中正常工作

安装SSH2 for PHP以在OSX 10.9.1上的Xampp Apache服务器上运行

.htaccess使用GET参数redirect

如何在一个Tomcat + Apache上部署多个Grails应用程序?

您可以使用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头,错误页面也是正确的语言。

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]

你不能像你那样解释Accept-Language头域 。 这不只是一个单一的值,而是一个加权值列表。

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

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...