2013-07-31 43 views
0

我試圖更新我的.htaccess文件的目標,所有頁面會迴應「404文件未找到」 - 錯誤被重寫到另一個URL。只有特定模式的重寫規則,如果404錯誤會發生

例子: 我有這3個環節:

:domain.com/category1/123-article-name.html

工作:domain.com/static-頁/ 10-方式對破壞 - 你 - webpage.html

不變:domain.com/simple-website.html

在這種情況下,第一個鏈接應重定向到domain.com/lost/123-article-name.html, 第二個已準備就緒。第三個環節不應該受我的規則影響。

希望你們能幫助我。對我來說,這是一件非常難的事情! 謝謝!

編輯:

RewriteRule ^(.*)/([0-9]+)-(.+).html$ lost/$2-$3.html [L] 

這是我這麼遠,但是這個規則是一種「愚蠢的」,因爲它不考維特請求的頁面存在與否。

+0

此頁面是否存在? 'domain.com/lost/123-article-name.html'(在'article-name'中用破折號代替下劃線)? – Mash

+0

對不起,我的錯。 「類別」或「目錄」之後的部分在重寫時完全相同。 – Felix

+0

您可以詳細瞭解鏈接'domain.com/category1/123-article-name.html'發生了什麼,因爲它應該正確重寫。 – miah

回答

0

您的規則和CMS的規則是互斥的。

第41行(您的規則)只會在文件存在的情況下執行,因爲如果該文件不存在(第38行和第39行的rewriteConds),則服務器將嘗試返回index.php?page=path_name,這將生成404錯誤。

如果您知道每行10到35缺失的類別/目錄的名稱,那麼您可以將規則應用到包含它們的網址。

RewriteRule ^(Ausbildung|Ausland|Berufswelt)/(?=.+-)(.+).html$ lost/$2.html 

原來的答案

您可以測試,看看文件或目錄添加一個重寫條件

RewriteCond %{REQUEST_FILENAME} !-f # True if the request isn't a file 
RewriteCond %{REQUEST_FILENAME} !-d # True if the request isn't a directory 
RewriteRule ^.*/([0-9]+)-(.+).html$ lost/$2-$3.html [L] 
#not I removed the first capture group because it is unnecessary. 

旁註存在:在你的榜樣,因爲+在正則表達式中是貪婪的,被捕獲的組爲domain.com/category1/123-article-name.html

  • 123條

其中一期工程,但可能會被人爲地限制你。你可以改變規則,包括提前正面看:

RewriteRule ^.*/(?=.+-)(.+).html$ lost/$1.html 

(?=.+-)告訴正則表達式引擎,如果找到至少一個-

你應該看看這個創建任意數量的字符匹配htaccess test,太棒了!

+0

這會起作用,但它也會重定向(動態生成)與文章頁面具有相同模式的頁面。我認爲,因爲它是按要求生成的,所以「-f」和「-d」不起作用。 – Felix

+0

你是對的!您的CMS是否生成404頁面? – miah

+0

如果我刪除了我上面發佈的RewriteRule,是的。 – Felix