【问题标题】:appending parameter using mod_rewrite according to the subdomain根据子域使用 mod_rewrite 附加参数
【发布时间】:2014-02-05 16:25:23
【问题描述】:

我对使用 mod_rewrite 很陌生,我一直在研究各种问题和文档文件,但没有找到解决方案。

人们可以使用 2 个主机之一访问我的网站:

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/ 来调试我的规则,但我无法让自己解决这个问题。

我做错了什么?

提前致谢。

【问题讨论】:

    标签: .htaccess mod-rewrite subdomain


    【解决方案1】:

    首先不要使用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]
    

    【讨论】:

    • 感谢您的及时答复,但这并不能解决我的问题。出于某种原因,我没有得到附加的 lang 参数。我刚收到原始请求....
    【解决方案2】:

    如果您以后可以添加其他语言,则可以使其更具动态性。因此,如果是 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]
    

    【讨论】:

    • 我不明白为什么这不起作用...我通过以下方式进行测试:fr.example.com/test.php?a=b(我在我的计算机上更改了主机文件以将 example.com 指向 127.0.0.1 ) 在页面 test.php 我打印请求。而不是得到:
    • 你不是在live box上测试这个吗?您必须模拟 dns,因此您需要将 fr.example.com 和 www.example.com 添加到主机文件中,因为它们都是不同的主机名
    猜你喜欢
    • 2012-01-22
    • 2010-11-15
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多