2012-11-17 27 views
0

我在我的.htaccess文件中使用以下mod-rewriteMOD-重寫規則被打破404路由

RewriteRule ^$ pages/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ pages/$1 [L] 

意圖是隱藏在URL顯示名爲/pages/子目錄。

所以這個:http://mysite.com/pages/home.html

看起來就像這樣:http://mysite.com/home.html

它的工作原理,但也有一些意想不到的後果。

作爲我在上面發佈的.htaccess代碼的直接結果,我的404路由根本不再工作。任何應該觸發404錯誤頁面的東西都會產生一個500 Server Error

如何解決?


編輯:

如以上所表明的,不如果自定義404頁在.htaccess或沒有定義關係。沒有它,或錯誤頁面的錯誤路徑,服務器仍應該路由到其默認的404頁面,而不是給出500 Server Error

當然,必須有一個標準的方法來抑制URL的部分,而不會破壞404錯誤的正常路由。從我的在線研究中可以看出,我上面的方法通常打破了404路由,但迄今爲止,我還沒有看到適用的解決方案。 (這不是一個WordPress的安裝;只是靜態的HTML內容)


編輯2:

因爲我只是想從URL抑制一個目錄,我從來沒有說過,我也有其他文件&目錄這是兄弟姐妹/pages/不能在/pages/指出,如/graphics//includes//css//cgi-bin/robots.txtfavicon.ico

也許這一切都是徒勞無益或比它更值得付出的麻煩?

尋找一個確定的答案任何一種方式。

+0

Wy你不只是將/ pages /的內容移動到/? –

+0

謝謝@max_,當然我已經考慮過了。答案是:因爲我想讓我的系統在我的靜態內容的邏輯上組織在一個位置。如果真的沒有可行的解決方案,那麼在URL中顯示'/ pages /'並不是世界上最糟糕的事情。 – Sparky

回答

3

以下配置將在pages/內查找您的靜態頁面,如果找到,它會顯示它們。這不應該打破404。 把它放在你的網站的根文件夾中.htaccess

RewriteEngine On 
RewriteCond %{DOCUMENT_ROOT}/pages/%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/pages/%{REQUEST_URI} -d 
RewriteRule ^(.*)$ /pages/$1 
+0

是的,非常接近!它適用於'/子目錄/ anyPage.html',但它在'/子目錄/'上失敗,並且'404'通常會默認爲'/子目錄/ index.html'。 – Sparky

+0

@ Sparky672查看已更新的答案 –

+0

你幾秒鐘就打敗了我自己的答案......所以你贏得了複選標記。 – Sparky

-1

如何添加一個錯誤頁面方向您htaccess文件來處理404頁:

ErrorDocument 404 /path/to/your/404.html 
+0

我已經有了。它是否存在並不重要。即使該行被刪除,服務器也會給出500,而不是默認的404。 – Sparky

0

這應該達到什麼樣的你正在嘗試做的。

RewriteEngine On 
RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9\_\-]+)\.html$ 
RewriteRule (.*) /pages/$1 [L] 
0

感謝您@KamilŠrot爲獲得最緊密的工作方案。但是,我需要添加另一個測試(-d)以查看請求的URI是否爲目錄。

這是工作很好,404 error頁面再次正確路由。

RewriteEngine On 
RewriteBase/
RewriteCond %{DOCUMENT_ROOT}/pages/%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/pages/%{REQUEST_URI} -d 
RewriteRule ^(.*)$ /pages/$1