0

在我的 htaccess 文件中,我将主 index_eng.php 页面中包含的所有页面重写为 .html 文件。

这是文件内容

RewriteEngine on
RewriteRule (.*)\.html$ index_eng.php?page=$1 [L]
# ErrorDocument 404 /404.html"

它工作得很好。问题是我想在与 index_eng.php 相同的文件夹级别上拥有另一个页面,该页面将被称为 index_fr.php,当我添加 htaccess 代码时,它将在法语中具有相同的页面并且类似地工作。

RewriteRule (.*)\.html$ index_fr.php?page=$1 [L]

只考虑第一个。第二个被忽略了。这个问题是否有任何解决方法,以便 htaccess 知道这两种语法?

4

3 回答 3

2

你可以做这样的事情..

RewriteEngine on
# If "lang" cookie is set, use it to get language preference
RewriteCond %{HTTP_COOKIE} ^lang=([a-z]{2,3})[-,;]? [OR]
# else use first language in HTTP Accept-Language request header
RewriteCond %{HTTP:Accept-Language} ^([a-z]{2,3})[-,;]?
# Rewrite home page requests to script, passing language preference in query string
RewriteRule ^$ /index.php?lang=%1 [L]

这样,您可以使用用户偏好或查找他们的浏览器首选项,并使您的脚本足够智能以使用变量来选择正确的版本..

--编辑---回应评论中的问题。尝试这样的事情。

在您的 .htaccess 中包含最重要的条件,将其替换RewriteRule

RewriteRule  (.*)\.html$ index_%1.php?page=$1 [L]

然后移动index_eng.phpindex_en.php你应该很好(如果 index_eng.php 用于任何直接链接,你可以将它们符号链接在一起)。

于 2012-10-02T13:11:21.810 回答
0

为什么不使用这样的重写?

RewriteEngine on
RewriteRule (.*)_en\.html$ index_eng.php?page=$1
RewriteRule (.*)_fr\.html$ index_fr.php?page=$1

对用户来说更加透明,知道他现在在网站的 en/fr 版本上;并且您可以更轻松地管理重写

于 2012-10-02T13:11:47.207 回答
0

首先,忽略第二条规则的原因是因为您正在使用[L]停止处理规则集的标志。http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_l

其次,你想定义两个匹配相同模式的规则,所以没有办法告诉哪个应该去英文索引文件,哪个应该去法语索引文件。您应该在规则中添加一些指示符,以便它知道选择哪种语言:

RewriteRule ^en/(.*)\.html$ index_en.php?page=$1 [L]
RewriteRule ^fr/(.*)\.html$ index_fr.php?page=$1 [L]

这将匹配这样的网址en/pagename.html/ fr/pagename.html。或者:

RewriteRule ^(.*)_en\.html$ index_en.php?page=$1 [L]
RewriteRule ^(.*)_fr\.html$ index_fr.php?page=$1 [L]

这将匹配这样的网址pagename_en.html/pagename_fr.html

于 2012-10-02T13:13:11.450 回答