htaccess两个链接重写

时间:2012-10-02 12:58:26

标签: php

在我的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知道两种语法?

3 个答案:

答案 0 :(得分: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.php移动到index_en.php并且您应该很好(如果在任何直接链接上使用index_eng.php,您可以将它们符号链接在一起)。

答案 1 :(得分:0)

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

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

对用户来说更透明,要知道他现在在网站的en / fr版本上;并且您更容易管理重写

答案 2 :(得分: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

之类的网址匹配