2012-03-21 58 views
1

我正在使用通过htaccess进行URL重写。以下是内容:修改现有的.htaccess(使用PHP)

Options +FollowSymLinks 
RewriteEngine on 
#RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^([0-9a-zA-Z_-]+)\.php$ index.php?slug=$1 [L] 

我现在的导航菜单结构:

<a href="home.php">Home</a> 
<a href="about-us.php">About Us</a> 
<a href="contact-us.php">Contact Us</a> 

我称之为数据库列蛞蝓和使用$ _GET [“塞”],我能够查询数据库并显示结果。到目前为止,它的工作正常。

我所试图做的事:

我试图让用户更改其内容的文字语言。我有2个标志图像,它们是超链接的(实际上有更多的语言)。

例子:

<a href="<?php echo '?lang=en'; ?>">English</a> 
<a href="<?php echo '?lang=pt'; ?>">Portugese</a> 

我已经在.htaccess中添加另一条线路:

RewriteRule ^([0-9a-zA-Z_-]+)\.php?lang=[a-z]$ index.php?slug=$1&lang=$2 [L,QSA] 

因此,可以说,我目前的公司简介页面。 URL可能为已读: http://localhost/mysite/about-us.php

现在可以说,我点击“PT”改变语言,页面导航到: http://localhost/mysite/about-us.php?lang=pt

如果我回声$ _GET [“郎”现在,它给我PHP的通知:

Notice: Undefined index: lang 

因为$ _GET [“郎”]没有定义,我无法抓住它的价值,因此,我无法查询数据库。当我提出改变语言的请求时,我也想确保我能够像我一样到达同一页面。因此,如果我在联系我们页面上,并且我点击了标志将语言更改为PT,我希望页面可以重新加载,在/不在URL中显示?lang = pt,我希望能够使用$获取此值_GET ['lang'],以便我可以查询数据库。这个怎么做?

回答

0

您的其他规则是行不通的:

RewriteRule ^([0-9a-zA-Z_-]+)\.php?lang=[a-z]$ index.php?slug=$1&lang=$2 [L,QSA] 

查询字符串不是URI的一部分,不会被你的正则表达式匹配:^([0-9a-zA-Z_-]+)\.php?lang=[a-z]$,你需要使用一个RewriteCond %{QUERY_STRING} (your regex)和一个反向参考。另一件事是没有$ 2反向引用,因为在正则表达式中只有一个括号,所以这一直是空白的。不过,你真的不需要这是您原来的规则是好的,你只需要添加一个QSA作为一个选项在括号:

RewriteRule ^([0-9a-zA-Z_-]+)\.php$ index.php?slug=$1 [L,QSA] 

这意味着任何现有的请求查询字符串被附加到目标。所以:

http://localhost/mysite/about-us.php --> index.php?slug=about-us 
http://localhost/mysite/about-us.php?lang=pt --> index.php?slug=about-us&lang=pt 

第二个请求中的查询字符串lang=pt只是附加在重写目标中。

+0

PERFECTTTTTT!非常感谢您将头部钉在头上并作出解释。这有很大帮助。 – Devner 2012-03-21 22:23:14