2012-09-08 41 views
0

我還沒有答案,所以我在這裏發佈。.htaccess正則表達式問題

我想在.htaccess文件匹配的root/language/sub/.../document形式的URL,然後把它改寫爲root/sub/.../document.php?lang=language

進出口接近擊中,但似乎我的正則表達式不「抓」輸入網址。這裏是:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond ^[a-z]{2}.*$/%{REQUEST_FILENAME}\.php -f 
RewriteRule ^([a-z]{2})/(.*)$ $2.php?lang=$1 

有人可以指出我這裏有什麼問題嗎?我不是regexp專家,也不是apache重寫。

Tyvm

*編輯*

root代表域即mydomain.net

這裏有幾個例子:

mydomain.net/fr/contact

應rewriten到

mydomain.net/contact.php?lang=fr

mydomain.net/en/articles/view

應rewriten

​​

等等

回答

1

我相信你正在尋找此配置:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} ^(.*/|)(en|de|fr)/(.*)$ [NC] 
RewriteCond %1%3.php -f 
RewriteRule ^(.*/|)(en|de|fr)/(.*)$ $1$3.php?lang=$2 [NC,QSA,L] 

說明:

RewriteCond %{REQUEST_FILENAME} !-d 

檢查,如果請求的URL是不是一個目錄。如果是,則不會處理重寫。

RewriteCond %{REQUEST_FILENAME} ^(.*/|)(en|de|fr)/(.*)$ [NC] 

檢查是否網址包含/xx/部的內側,其中xx是一個endefr。標記[NC]允許大寫和小寫字符,因此例如ENFr將被接受。如果網址中沒有這樣的「語言」部分,則不會處理重寫。

RewriteCond %1%3.php -f 

檢查是否%1%3.php文件存在,其中%1(.*/|)%3是從以前的RewriteCond ^(.*/|)(en|de|fr)/(.*)$(.*)匹配。如果這樣的php文件不存在,將不會處理重寫。

RewriteRule ^(.*/|)(en|de|fr)/(.*)$ $1$3.php?lang=$2 [NC,QSA,L] 

在重寫規則左條件會的話那這條線,要匹配,因爲它已經用的RewriteCond檢查,所以現在將處理重寫PHP文件,加入的一部分,但由於還有[QSA]標誌,它也會保留其他的GET參數,所以lang將被添加到現有參數中。國旗[L]表示這是最後的重寫規則,應該適用,並且不會再使用此URL處理重寫。

+0

TYVM。現在無法查看,但明天肯定會通知您。現在我還有最後一個問題。如果我添加一些其他的GET變量,它們應該被添加到'lang = foo'參數中。所以它看起來像我= =在字符串的末尾搜索'\?。*',如果這樣添加'&lang = foo',或者添加'?lang = foo'。這樣我就不會失去GET行爲。我想你可以在你之前添加一個'RewriteRule'行?或者我需要爲每個'RewriteRule'製作另一塊'RewriteCond'?謝謝,我彈出你接受的答案^^ – PinkTurtle

+0

(只是爲了澄清一點)'%{REQUEST_FILENAME}'包含完整的URI,即'mydomain.net/fr/contact'嗎?如果不是,那麼'(。*/|)'(第二行)對我來說沒有任何意義,因爲lang會成爲第一個url _bit_。另外,在'(。*/|)'中,管道'|'是什麼?我明白'(。* /)'匹配以'/'結尾的所有內容。狂猜:可選條件?感謝您的幫助。 – PinkTurtle

+0

@JulienMatthey - 標記'[QSA]'會自動處理''''''''問題,不用擔心:)關於你關於'(。*/|)的問題' - 這將匹配任何結尾用'/'先前的語言縮寫,或空字符串是沒有什麼,所以'|'是**或**運算符在這裏。我希望這有幫助。 –

0

嗯,我不知道根有做,你有沒有試過

RewriteRule ^root/([a-z]{2})/(.*)$ root/$2.php?lang=$1 
+0

對不起,我可以更清楚了,'root'實際上代表'domain'(即'mydomain.net') – PinkTurtle

0

什麼問題是第二個RewriteCond。但你的問題含糊不清。如果你的意思是你想轉換

root/foo/sub/.../something.php 

root/sub/.../something.php?lang=foo 

然後開始用這個坐立不安:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^root/([^/]+)/sub/(.*)/%{REQUEST_FILENAME}$ root/sub/$2/%{REQUEST_FILENAME}?lang=$1 
+0

謝謝你的回答 - 現在就測試它。我只是做了一個編輯,所以請閱讀。 'root'實際上代表域名,即'mydomain.net'。抱歉讓你們在這裏感到困惑^^ – PinkTurtle