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