【问题标题】:mod_rewrite: setting GET depending on HTTP_HOSTmod_rewrite:根据 HTTP_HOST 设置 GET
【发布时间】:2009-08-27 17:20:12
【问题描述】:

我最近发现了 mod_rewrite 模块的强大功能,我需要一些帮助。

假设我有一个网站有两个域名映射到同一个主机...

example.com
example.net

我想根据 HTTP_HOST(即 .com OR .net ?)设置一个 GET var ...

/index.php?lang=en
/index.php?lang=es

但是需要注意的是……我已经有 3 个 RewriteRules……

RewriteRule ^(about|contact)/?$ /index.php?page=$1 [NC]
...
..

如果我按照here(RewriteCond 的底部)的示例,我将不得不为每个 HTTP_HOST(即 .com 或 .net)复制 3 个 RewriteRules 并静态添加 GET var; &lang=en OR &lang=es 和每条规则的结尾...

有什么方法可以自动执行此操作,而不必重新复制 3 条规则,它们最后只有一个 get var 不同?

PS。我知道这可以通过脚本语言完成,但我想知道这是否可以通过 mod_rewrite 完成,以及如何完成。

谢谢!

【问题讨论】:

    标签: apache mod-rewrite get


    【解决方案1】:

    尝试将这样的内容放在所有其他规则之前:

    RewriteCond %{HTTP_HOST} .com$
    RewriteRule ^(.*)$ $1?lang=en [QSA]
    RewriteCond %{HTTP_HOST} .net$
    RewriteRule ^(.*)$ $1?lang=es [QSA]
    

    虽然您最好使用环境变量来指定语言,但在每个虚拟主机中使用带有不同语言的 SetEnv 指令。

    或者甚至更好,看看mod_negotiation,它包含一些处理语言的标准功能。

    【讨论】:

    • 我会检查一下 QSA 标志.. 看起来很有希望。
    • 虽然提交的代码有很大帮助,但它本身毫无用处。您将面临无限递归,因为 Apache 会继续将每个页面重定向到 ?lang=en|es 即使这已经设置了。所以在之前添加以下行: RewriteCond %{QUERY_STRING} !(lang=( en|es)) 如果已设置,则不会重定向到 ?lang=en|es ;)
    • 不应该有任何无限递归,除非您稍后重新启动规则重写过程。从你的问题来看,我相信你没有那样做。
    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 2013-05-14
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多