我使用mod_rewrite相当新,我一直在挖掘各种问题和文档文件而没有得到解决方案。
人们可以使用以下两个主机之一访问我的网站:
www.example.com
fr.example.com
子域表示用户的语言。 如果使用www,则应假定该语言为英语。
我要做的是检测子域并将其值作为参数传递给原始请求。
以下是我的尝试:
RewriteEngine On
# match the subdomain
RewriteCond %{HTTP_HOST} ^fr.example.com$ [NC]
# Make sure I don't already have a "lang" in the query string
RewriteCond %{QUERY_STRING} !lang= [NC]
RewriteRule (.*) $1?lang=fr [QSA]
# match the subdomain
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
# Make sure I don't already have a "lang" in the query string
RewriteCond %{QUERY_STRING} !lang= [NC]
RewriteRule (.*) $1?lang=en [QSA]
我正在通过以下方式测试: http://fr.example.com/index.php?a=1 在index.php中,我正在转储请求参数的内容,但我一直得到:
array ( 'a' => '1', )
我期待看到:
array ( 'a' => '1', 'lang' => 'fr)
我正在使用http://htaccess.madewithlove.be/调试我的规则,但我无法解决此问题。
我做错了什么?
提前致谢。
答案 0 :(得分:0)
首先不要使用http://htaccess.madewithlove.be/
测试,因为这是非常可靠的。最好在本地主机上进行测试。
现在您的规则也需要更正。试试这段代码:
RewriteEngine On
RewriteBase /
# match the subdomain
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^fr\.example\.com$ [NC]
# Make sure I don't already have a "lang" in the query string
RewriteCond %{QUERY_STRING} !(^|&)lang= [NC]
RewriteRule ^(.*)$ $1?lang=fr [L,QSA]
# match the subdomain
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
# Make sure I don't already have a "lang" in the query string
RewriteCond %{QUERY_STRING} !(^|&)lang= [NC]
RewriteRule ^(.*)$ $1?lang=en [L,QSA]
答案 1 :(得分:0)
如果您以后可以添加其他语言,则可以使其更具动态性。因此,如果它是www或非www,它将是en
,如果是其他任何东西,它可以追加。这是你可以做到的另一种方式。
RewriteEngine On
#match en domain
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$ [NC]
RewriteCond %{QUERY_STRING} !(^|&)lang= [NC]
RewriteRule ^(.*)$ /$1?lang=en [QSA,L]
#match other languages (subdomains)
RewriteCond %{HTTP_HOST} ^(.+)\.example\.com$ [NC]
RewriteCond %{QUERY_STRING} !(^|&)lang= [NC]
RewriteRule ^(.*)$ /$1?lang=1% [QSA,L]