2010-10-24 35 views
0

我即將更新我的網站以使用CakePHP而不是舊的本地框架。我需要編寫HTAccess文件以將舊的PHP參數URL重定向到新的CakePHP SEO友好的URL,但我無法使其工作。重定向/ .htaccess將舊的PHP參數URL更改爲適合SEO的CakePHP URL?

我htacess文件(一個在app/webroot的)看起來像這樣的時刻:

RewriteEngine On 

RewriteRule ^index.php?action=view&item=172$ index.php?url=item/172 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

它不工作。我嘗試刪除L並將它重定向到項目/ 172,但這也不起作用。當前版本的URL參數未設置,如果我查看$ _SERVER ['REQUEST_URI'],它不會改變。雖然我不知道mod_rewrite是否會改變這一點。我的重寫規則似乎沒有被激活,即使直接從我的瀏覽器的URL欄複製。我試了一下,並拿出領先的/。沒有骰子。

這是怎麼回事?

我該如何寫一個更一般化的URL來完成轉換?我試過類似的東西:

RewriteRule ^index.php?action=view&item=([0-9]+)$ index.php?url=items/$1 [R=301,L]  

但是這也沒有效果。我究竟做錯了什麼?

編輯這是積極的真氣。

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301] 

這很有效。它會將所有網址導入正確形成的Cake網址。然後哪個蛋糕的處理器啓動並以某種方式處理。我不確定它是如何錯過Cake的第二個重寫規則,但它確實如此。嘗試這樣的:

RewriteRule ^(.*)$ item/172 [R=301] 

返回一個畸形的重定向,因爲它最後在前面的一個指定:

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301,L] 

即聲明它永遠無法完成。

所以,實際上,我相當困惑,爲什麼這一個:

RewriteRule ^(.*)$ /index.php?url=item/172 [R=301] 

返回正確的蛋糕網址,但它和它被髮送到正確的頁面。但是,只要我嘗試更改第一部分,就會啓動失敗。

等一下。當它擊中?時,它開始失敗。它成功匹配index.php但不是index.php?但是,轉義它沒有區別。

RewriteRule ^index.php\?$ /index.php?url=item/172 [R=301] 

無法匹配或返回正確的URL。而且它看起來並不符合Cake的正常捕捉,因爲$_GET['url']是空的。你如何轉義參數字符來匹配mod_rewrite中的字面意思?

+0

GAH! Mod重寫的*&@ $&錯誤是什麼?我有這個工作約30秒,增加了另一個重寫規則,它又停止了工作!我刪除了其他重寫規則,但它仍然不能正常工作!到底怎麼回事?! – 2010-10-24 08:22:52

回答

4

隨着RewriteRule你只能測試URI路徑,但不是查詢:

模式最初將針對主機名和端口後的URL部分匹配和查詢字符串之前。如果希望與主機名,端口或查詢字符串匹配,請分別使用RewriteCond%{HTTP_HOST},%{SERVER_PORT}%{QUERY_STRING}變量。

所以:

RewriteCond %{QUERY_STRING} ^action=view&item=([0-9]+)$ 
RewriteRule ^index\.php$ /index.php?url=item/%1 [R=301,L] 
+0

謝謝!那樣做了。不知何故,在我所有的閱讀和搜索中,都從未提及或提出過。我從來沒有想到,查詢字符串將與主URL分離。 – 2010-10-24 08:59:25