2016-11-01 85 views
1

我想設置一個子文件夾的根文件夾,拿什麼通過追加他們的根之前的目錄重寫每個請求的URL,像如何在.htaccess中設置一個子目錄作爲根目錄?

example.com/cat/ -> example.com/public/cat/ 
example.com/cat/black/ -> example.com/public/cat/black/ 
example.com/public/cat/ -> example.com/public/public/cat/ 

我已經試過

Options +FollowSymlinks 
RewriteEngine on 
RewriteBase/

RewriteRule (.*) /public/$1 [L] 

但是,當我要求的任何它的頁面,我得到了內部服務器錯誤。

回答

1

該規則目前爲止是正確的。內部錯誤來自無盡的重寫循環。

當您請求example.com/cat時,它將被重寫爲example.com/public/cat。但是這個新的URL被反饋到重寫模塊中,並且example.com/public/cat被重寫爲example.com/public/public/cat,其被重寫爲example.com/public/public/public/cat等等,直到超過一些內部計數器並且Apache報告內部錯誤。

要解決此問題,您必須添加condition,它告訴Apache停止進一步重寫。爲此,您可以在發生重寫時使用由Apache設置的variables之一。

RewriteCond %{REDIRECT_STATUS} ^$ 
RewriteRule (.*) /public/$1 [L] 

此檢查,如果REDIRECT_STATUS爲空(^$)。當它是空的時候,重寫。重寫後,REDIRECT_STATUS將被設置而不是空的,因此不會進行進一步的重寫。


如果您不會改寫

example.com/public/cat/ -> example.com/public/public/cat/ 

你也可以檢查,如果請求的URL不public,例如啓動

RewriteRule !^public/ /public%{REQUEST_URI} [L] 
+0

這很奇怪。我認爲,如果我不重定向,它只是從重寫的路徑發送文件,而不是重新啓動整個事情。檢查重定向狀態有點怪異,所以我會和第二個一起去。沒有標誌或什麼東西只是重寫響應的路徑?或者,也許在沒有破壞結構語義的情況下使用PHP的幫助? – Tomato

+0

您可以看到Apache的[規則集處理](https://httpd.apache.org/docs/current/rewrite/tech.html#InternalRuleset)的圖像,它顯示了在「URI已更改」時,循環再次開始。 'RewriteRule'是重寫請求的指令。您也可以使用PHP,並通過查看['__ SERVER ['REQUEST_URI'']](http://php.net/manual/en/reserved.variables.server.php)並提供適當的內容來執行相同的操作。 –

+0

我還沒有試過['END'](https://httpd.apache.org/docs/current/rewrite/flags.html#flag_end)標誌,但也許這適用於您的目的。 –

相關問題