2014-04-07 21 views
0

目前我只是在我的網站一種語言,檢測語言,並保持當前的URL模式

而且我實現了友好的URL通過的.htaccess,比如:

RewriteRule ^post/(.+)/(.+) post.php?id=$2&friendly=1

所以:

domain.com是首頁,domain.com/the-title/5是ID爲5的帖子的頁面。

N我想將其作爲默認語言網址,例如,下一種語言是:

​​是主頁,domain.com/es/the-title/6是西班牙語ID爲6的帖子的頁面。 (但以往的規則應該工作,太)

問題是,

我應該如何適應我的(或附加)重寫規則來檢查URL(第一分割)的2個第一字符並將其添加爲一個PARAM,如:&lan=es,如果它沒有找到,然後不加這個參數?

比方說:

^post/(.+)/(.+) post.php?id=$2&friendly=1(英文)

^es/post/(.+)/(.+) post.php?id=$2&friendly=1&lan=es(西班牙)

但是,如果更多鈔票,

  • 要只是更多語言(和添加,如果需要的話,額外的參數),
  • 要剛工作的機智其他規則,如:

^es/photo/(.+)/(.+) photo.php?id=$2&friendly=1&lan=es(西班牙)

有什麼建議?

+0

與您的其他參數相同:'^(..)/ post /(.+)/(.+)post.php?id = $ 3 &friendly = $ 2&lan = $ 1'(..)表示正好2個字符。 – njzk2

+0

@ njzk2是的,謝謝!問題是我不想爲當前的(默認)語言添加那個劈啪聲,任何想法? –

+0

您可以使用'rewriteCond'來檢查url中的語言參數。 –

回答

1

這裏是我的建議:

RewriteRule ^/?((en|es)/)?post/(.+)/(.+)$ post.php?id=$4&friendly=1&lan=$2 

/?允許可選的字符串的begining斜線。這使規則能夠在htaccess目錄聯繫人和httpd.conf服務器上下文之間互換地移動。

((en|es)/)?允許選擇指定兩個接受的語言代碼之一。

請注意,我沒有爲語言部分提供通配符,因爲我假設您只使用已知語言子集,所以使用除已知語言代碼之外的其他內容(或者錯過了整個事物)應該通過處理其他規則(或可能導致404)。

如果這不是你可以,如果你希望正好兩個字符,或者(.{2}(-.{2}))如果你希望也處理像es-ES語言代碼的正則表達式從(en|es)第一部分變爲(.{2})的情況。

+0

這就是我正在尋找的非常接近,謝謝!如果第一個slug(en | es | ..)是已知的,是否有方法可以添加額外的參數?而且,如果它不存在,它也必須工作。它實際上是這樣的,但這樣我就不必爲posts,fotos,any-post-type等類型實現它。 –

+0

@ToniMichelCaubet在這種情況下,'lan'參數將始終被傳遞。如果存在參數,則爲參數指定'en'或'es'的值,如果未指定'en'或'es',參數將爲空(即'lan =')。你的post.php腳本應該能夠處理存在值且不存在的情況。 '((en | es)/)?'的外括號和問號是允許URI的這部分是可選的。 –

+0

好的,所以不是通過語言I添加額外的規則可以通過預先加入'((任何其他語言 - 我想要))來編輯當前的規則嗎?'並且我可以保留當前的url模式,但是無論如何我檢查參數,對吧? –

2

這樣的事情可能會奏效。我沒有測試它,但你可以使用的RewriteCond來檢查URI的具體結構,如果它匹配,使用以下規則。如果沒有,則繼續執行原始規則。

#Does the uri match 2 characters followed by /post/? 
RewriteCond %{REQUEST_URI} ^../post/ 
#then use this rule and stop processing rules 
RewriteRule ^(..)/post/(.+)/(.+) post.php?id=$3&friendly=1&lan=$1 [L] 

#Else use this rule 
RewriteRule ^post/(.+)/(.+) post.php?id=$2&friendly=1&lan=en 

編輯:我在第二條規則的末尾添加了默認語言。這樣總是有一個$_GET['lan']參數。你可以關閉它並在php中設置默認值。你的選擇,沒有區別。

0

這應該爲你工作:

RewriteEngine On 

RewriteRule ^([a-z]{2})/post/([^/]+)/([0-9]+)/?$ post.php?id=$3&friendly=1&lan=$1 [L,QSA] 

RewriteRule ^post/([^/]+)/([0-9]+)/?$ post.php?id=$2&friendly=1&lan=en [L,QSA] 
+0

嗨!我想刪除'post'部分並將其設置爲任何URL,如果它沒有任何2個字符+'/',則不發送參數lan(添加,它不應覆蓋現有的),其他方式它是(但任何網址) –

+0

對不起完全不瞭解您的意見。你能澄清一些例子嗎?您想要在瀏覽器中顯示哪個網址,哪個網址應該是內部網址? – anubhava

2

我只能回答你的意見的原因,我們需要更多的背景下...

  1. 使用默認的頁面做一個臨時重定向(302)到默認語言或用戶語言。
  2. 總是使用相同的方案,從相同的模式獲得語言(http://mydomain.com/en/mypage.php
  3. 使用完整的語言代碼,如果你將有一個大型的公共或非常重要的內容,如EN_US,fr_FR,則fr_CA ...
  4. 爲了避免捕獲以下字符,比如「before /([^ /] +)/ after」),在某些情況下,您需要在正則表達式中使用負面搜索,這是強制性的。
  5. 如果您沒有語言信息,則用戶不是來自有效的URL,而是將他重定向到包含語言信息(默認或用戶語言)的頁面。
  6. 如果用戶使用直接的php鏈接,將他重定向到官方鏈接,以避免重複的內容。您可以使用$ _SERVER ['REQUEST_URI']來檢查它。
  7. 使用框架來管理它或至少一個基地來控制路線。

有了這些建議,你可以只使用以下重寫規則的所有網站:

RewriteRule ^([^\/]+)/([^\.]+)\.([\.]+)$ index.php?lang=$1&route=$2&format=$3 [L,QSA] 

在這裏,我捕捉到的語言(ES,EN,EN_US,FR ...),路線(post/5,gotabeer,cats/postit/thumb/2)和格式(html,json,jpeg ...)。 (我沒有嘗試重寫規則,但它應該可以工作)