在htaccess工作中不能做出负面的条件
问题描述:
我试图编写一个多语言网站的规则。例如,www.hostname.com/fr & www.hostname.com/de都可以,但尝试使用其他语言标记应重定向到www.hostname.com/en。 www.hostname.com/it重定向到www.hostname.com/en,www.hostname.com/es重定向到www.hostname.com/en等...在htaccess工作中不能做出负面的条件
我成功地制定了一些规则“积极”的方式,但每次我加一个!创造一个负面的规则,它不起作用。
例如:
RewriteCond %{HTTP_HOST} ^www.hostname.com$
RewriteCond %{REQUEST_URI} ^/?([a-z]{2})/?$
RewriteCond %{REQUEST_URI} ^/?(fr|de)/?$
RewriteRule (.*) http://www.hostname.com/en [L,R=301]
此代码重定向一切hostname.com/en。我希望只有标签不同于fr et de重定向到en。所以我试过了:
RewriteCond %{HTTP_HOST} ^www.hostname.com$
RewriteCond %{REQUEST_URI} ^/?([a-z]{2})/?$
RewriteCond %{REQUEST_URI} !^/?(fr|de)/?$
RewriteRule (.*) http://www.hostname.com/en [L,R=301]
刚刚加了个!但它不起作用,URL永远不会重定向。我可能在编写规则时遗漏了一些东西......
答
你可以将它分成两个规则。第一条规则处理fr
,de
和en
。它不会重写任何内容,并将请求不变地传递给Apache。如果不匹配,第二个规则处理一切
RewriteCond %{REQUEST_URI} ^/(?:fr|de|en)
RewriteRule^- [L]
RewriteRule ^[a-z]{2}/(.*)$ /en/$1 [R,L]
决不会启用301
测试,详见这个答案Tips for debugging .htaccess rewrite rules。
+0
谢谢你的帮助! – Neow 2013-04-09 11:28:36
当我在http://htaccess.madewithlove.be进行测试时,您的否定规则完全按预期工作。但是,你将在'en'上有一个重写循环。你可能需要用'^ /!?(FR | DE | EN)?/ $'此外,REQUEST_URI应该总是用'/'所以''使它可选的是没有必要的开始。 – 2013-04-08 16:16:34
我同意Michael Berkowski。您正在遭受无限循环,因为/ en路径正被重定向到自身。 mod_rewrite中的'L'标志并不像很多人想象的那样。即使是重写URL要经过从顶部的httpd.conf或的.htaccess的指令,以及'L'标志不阻止这种情况发生。 – Bobulous 2013-04-08 18:48:59