2013-04-30 68 views
1

我已將我的博客從一個CMS /博客系統更改爲使用Habari,其中有一些默認的Apache重寫規則,我試圖將所有舊文章URL從/articles/article-name重定向到/article-name。下面我發佈了我正在使用的URL重寫和Habari系統包含的默認設置,我認爲這可能是一個放置問題。我的重寫應該超過他們的?Apache重寫規則與Habari默認重寫

Habari的默認的Apache Rwrites:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteBase/
RewriteRule . index.php [PT] 
RewriteRule ^(system/(classes|handlers|locale|schema|$)) index.php [PT] 

我的URL重寫上漲到Habari的重寫規則的最後

RewriteRule ^/articles/(.*)$ /$1 [R=301,PT] 

回答

1

是的,你要插入您的規則在一個特定的地方在順序中:

... 
RewriteBase/
RewriteRule ^/articles/(.*)$ /$1 [R=301,PT] 
RewriteRule . index.php [PT] 
... 

這將允許您的舊URL被重寫,然後Habari可以處理重新書面要求。

+0

給你一個正確答案的投票,但這是我嘗試過的地方之一之前和我再次嘗試一次,我什至不知道爲什麼它不工作,謝謝。 – ars265 2013-05-01 00:15:47

1

注:我知道一個答案已被接受,但也許這人會解決你的問題:

您的規則:RewriteRule ^/articles/(.*)$ /$1 [R=301,PT]

如果規則是內部一個.htacces文件,它不起作用,因爲:

「...因此,具有^/never的模式匹配每個目錄上下文...」(從Per-directory Rewrites中提取)

當.htaccess文件中使用的規則應該是:

RewriteRule ^articles/(.*)$ /$1 [R=301,PT] 

但是,如果目錄/articles不存在,則使用第一條規則你的永遠不會被應用,因爲第一個創建一個新的請求。

如果是這樣的話,你必須修改當前的代碼,以:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteBase/

# Add next line if directory "/articles" doesn't exist. 
# If exists, the previous condition "%{REQUEST_FILENAME} !-d" 
# will exclude it from the rule. 
RewriteCond %{REQUEST_URI} !/articles [NC] 

RewriteRule . index.php [PT] 

# Add new rule 
RewriteRule ^articles/(.*) /$1 [R=301,PT,NC] 

RewriteRule ^(system/(classes|handlers|locale|schema|$)) index.php [PT] 

上面的修改也適用於在主要的Apache配置文件中的代碼,除了重寫規則應該是:

RewriteRule ^/articles/(.*) /$1 [R=301,PT,NC] 

與您的問題中的規則類似。

+0

非常感謝您的回覆,但仍然無法正常運作。我已經發現,在需要刪除文章之前。 – ars265 2013-05-01 15:00:21

+0

.htaccess文件在哪裏以及錯誤或問題是什麼?確保在進行任何測試之前瀏覽器的緩存已清除。 – 2013-05-01 15:07:07

+0

據我在http://martinmelin.se/rewrite-rule-tester/上的測試可以知道,他們應該工作,嘗試清除緩存和所有內容,但仍然不行。任何更多的想法,不勝感激。 – ars265 2013-05-01 23:22:45

0

說明:提供一個基於規則的重寫引擎重寫的飛行 狀態請求的URL:擴展 模塊標識符:rewrite_module 源文件:mod_rewrite.c 摘要 mod_rewrite的模塊使用基於規則的重寫引擎,基於PCRE正則表達式解析器,即時重寫所請求的URL。默認情況下,mod_rewrite將URL映射到文件系統路徑。但是,它也可以用於將一個URL重定向到另一個URL,或調用內部代理提取。

mod_rewrite提供了一種靈活而強大的方式來使用無限數量的規則操縱URL。每個規則可以具有無限數量的附加規則條件,以允許您根據服務器變量,環境變量,HTTP標頭或時間戳重寫URL。

mod_rewrite在完整的URL路徑上運行,包括路徑信息部分。重寫規則可以在httpd.conf或.htaccess中調用。重寫規則生成的路徑可以包含查詢字符串,也可以導致內部子處理,外部請求重定向或內部代理吞吐量。

詳細的mod_rewrite文檔提供了更多細節,討論和示例。

指令 RewriteBase 的RewriteCond RewriteEngine敘述 RewriteMap指令 RewriteOptions 重寫規則 主題 記錄 評論 頂部 記錄

的mod_rewrite在以trace8日誌級別的TRACE1提供其行動的詳細記錄。日誌級別可以使用LogLevel指令專門爲mod_rewrite設置:最高級別調試,不記錄任何操作,而trace8表示實際上所有操作都被記錄。

對mod_rewrite使用高跟蹤日誌級別會顯着降低Apache HTTP Server的速度!使用高於trace2的日誌級別僅用於調試! 例

LogLevel的警報改寫:TRACE3 RewriteLog

熟悉較早版本的mod_rewrite無疑將尋找RewriteLog和RewriteLogLevel指令。此功能已被上述新的每模塊日誌記錄配置完全取代。 爲了獲得mod_rewrite特定的日誌消息,通過grep管道日誌文件: tail -f error_log | fgrep'[rewrite:'