2011-07-08 116 views
0

我一直在努力解決這個問題,現在幾個小時&如果有人不介意幫助我,它可能會爲我節省一些時間。我的問題是關於Apache mod_rewrite;當然有噸的文件在那裏,但沒有具體到我的要求分別是:Apache Mod重寫幫助

採取URL格式爲:

language/pagename.php 

(語言要麼是「英語」或「法國」 ,我會爲每一個單獨編寫一個規則[只需要一個例子],頁面名稱將是任何單詞字符(w+)。所有的URL將有一個.php擴展名)。

然後重寫它,因此URL不會在用戶瀏覽器改變,但讓PHP能以這種格式接收它:

language/page.php?slug=pagename 

例如所以$_GET['slug']將返回值pagename,然後所有請求都由page.php處理。

到目前爲止,我最好的猜測是

RewriteEngine On 
RewriteBase/
RewriteRule ^english/(\w+).php$ english/page.php?slug=$1 

然而,這使PHP告訴我,slug=page這個URL,例如english/financial.php;而不是financial

試過很多其他的正則表達式公約太(.)代替w &等等..

回答

0

使用這些規則:在

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(english|french)/([^/\.]+)\.php$ /$1/page.php?slug=$2 [NC,QSA,L] 
  1. 這需要有地方的.htaccess文件在根文件夾中。如果您要將其配置文件(例如httpd-vhost.conf<VirtualHost>指令),則規則需要稍微改變。

  2. 此規則應適用於任何語言,只要你將其添加到規則(english|french部分)。

  3. 此規則有一個條件,如果此文件已存在,則不會重寫。 這應該可以解決你的問題slug=page:在你的規則中,你很可能有一個重寫循環(在重寫發生之後它會進入下一次迭代 - 這就是mod_rewrite的工作原理,並且你需要有一些邏輯來打破這個循環)。您可以使用RewriteCond %{REQUEST_URI} !^/(english|french)/page\.php [NC]而不是RewriteCond %{REQUEST_FILENAME} !-f,但維護起來要困難得多(您需要在此處添加語言以及在重寫規則本身中)。

  4. 如果您已經有其他一些重寫規則,請注意將它們放在正確的位置(規則順序)。

  5. 因爲我不知道是肯定的名稱(蛞蝓)會是什麼頁面,我用這個模式:[^/\.]+(任何字符除了/.)..但是你可以將其更改爲\w+或任何你想會更好。

  6. 規則保留任何可選頁面參數(查詢字符串) - 可用於保護轉診/跟蹤代碼等

+0

你beuaty!在一個規則中涵蓋兩個語言文件夾的額外獎勵點數。乾杯。 – Reece