【问题标题】:Browser language based 404 pages with mod_rewrite how to基于浏览器语言的 404 页面与 mod_rewrite 如何
【发布时间】:2011-01-04 21:44:11
【问题描述】:

我试图通过评估客户端 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 明智,因为完全没有 404 可能会更好,但我认为这会更合乎逻辑并保持日志一致等,但我根本想不通如何通过 apache 和 HTTP:Accept-Language 来实现。

任何 cmets 将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢。效果很好,请在下面查看自己的答案。
    • 这在 vhost 配置和 .htaccess 文件中都有效吗?
    • @mr-euro 是的。虽然绝对路径/eng/error404.php 可能是相对于根目录的,但我不确定
    【解决方案2】:

    Pekka 之前的回答完成了这项工作。我在这里包含完整的代码以供参考,因为它不适合 cmets。

    我从没想过甚至可以重写 40​​4 文档指令。只是为了向其他人澄清......“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]
    

    【讨论】:

    • “...仅当指令位于虚拟主机根目录而不是顶级目录时...”您的意思是这在 .htaccess 文件中不起作用,而仅在 Apache vhost 配置中起作用?
    【解决方案3】:

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

    你最好用 PHP 进行语言协商,因为 mod_rewrite 太有限了。

    【讨论】:

    • 谢谢,但语言逻辑工作得很好,这是我遇到问题的 404,并确保 mod_rewrite 很难但绝对足够强大。
    • @luison:如果您只是测试 Accept-Language 值是否以es 开头,那么您的逻辑肯定不正确。
    猜你喜欢
    • 2021-05-18
    • 2020-11-04
    • 2020-05-11
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多