2012-03-21 50 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