2012-10-19 35 views
1

目前正在爲一家公司做一些URL重寫,我正在努力讓新的URL指向正確的文件。Mod重寫相同的格式,不同的來源

我沒有訪問CMS - 頁面是在兩種格式生成:

  • website.com/pressReleases.php?lang=EN
  • website.com/page.php?pagename =關於& LANG = EN

我已經使用重寫每個格式,使他們進入相同的所需格式(website.com/language/pagename):

格式1(website.com/pressReleases.php)

RewriteCond %{QUERY_STRING} ^lang=(.*)$ 
RewriteRule ^(.*).php$ /%1/$1? [L] 

格式2(website.com/page.php?pagename=About & LANG = EN)

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /page.php 
RewriteCond %{QUERY_STRING} pagename=([^&]+)&lang=([^&]+) 
RewriteRule ^page.php$ /%2/%1? [R=301,L] 

問題是兩個格式重寫的輸出是相同的,但源文件/路徑是不同的。當我創建另一個重定向到一個不錯的URL轉發給實際源同時適用於:

RewriteRule ^([A-Za-z]+)/([0-9]+)/([a-zA-Z0-9_-]+)$ productSelection.php? groupid=$2&lang=$1 [L] 

有什麼辦法,我可以使用兩種類型的URL一樣漂亮的格式,但轉發到原來的路徑?我是否錯誤地構建了我的重寫,這阻止了這一點?

任何幫助非常感謝!

回答

0

您可以嘗試爲PHP文件先做-f檢查,如果失敗,則使用第二格式:

# format 1 
RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/%2.php -f 
RewriteRule ^/?([^/]+)/(.*)/?$ /$2.php?lang=$1 [L,QSA] 

# format 2 
RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/%2.php !-f 
RewriteRule ^/?([^/]+)/(.*)/?$ /page.php?pagename=$2&lang=$1 [L,QSA] 

此外,您還需要檢查與實際請求在您的第一格式1的規則:

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /([^\ \?\.]+)\.php\?lang= 
RewriteCond %{QUERY_STRING} ^lang=(.*)$ 
RewriteRule ^(.*).php$ /%1/$1? [L] 
相關問題