2017-02-07 38 views
0

我在Apache2下有一個網站,可以通過不同的URL從外部和內部訪問。它必須工作在example.com/example.com/sites/mysite/。因此,我使用相對URL在我的HTML,如:Apache的mod_rewrite的一些高級功能?

../static/css/style.css 
../some_other_page.html 

爲了處理無效的請求不存在的頁面(例如,example.com/non_existing_page/)我做了一個自定義錯誤頁(其中還包含鏈接到其他部位該網站的),並使用mod_rewrite傳遞的要求有:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
RewriteRule .* /custom_404_page/ [PT] 

其結果是,用戶看到很好的定製頁面,而地址欄仍然包含原來的請求。該規則也可以根據基本URL進行調整。但是,當向子目錄(例如,example.com/non/existing/page/)提出無效請求時,錯誤頁面被破壞,因爲鏈接是相對的(例如,../static/css/style.css現在解析爲example.com/non/existing/static/css/style.css)。我可以使用[R](重定向)標誌而不是[PT]修復此問題;然而,然後地址欄也讀取example.com/custom_404_page/,我想避免。

因此,我不知道是否有可能Apache2下運行,同時保留所有的三個功能:

  • 可能性在不同的基本URL
  • 顯示自定義錯誤頁的無效請求
  • 護跑地址欄中的原始請求
+0

你可能想使用'FallbackResource'來代替,試試看。 –

回答

0

有一種解決方法,它適用於大多數網站:

Define MY_ROOT_BASE /sites/mysite/ 
Define MY_ROOT_PAGES "(static|index|some_page|some_another_page)" 

RewriteEngine On 
RewriteCond %{REQUEST_URI} ^${MY_ROOT_BASE}${MY_ROOT_PAGES}/ [NC] 
RewriteRule .* - [L] 
RewriteRule ^${MY_ROOT_BASE}(.*?/)?${MY_ROOT_PAGES}/(.*)$ ${MY_ROOT_BASE}$2/$3 [NC,R,L] 

這將更正所有包含一個根頁面名稱但不在根位置的請求。例如,example.com/sites/mysite/some/rubbish/static/css/style.css將變爲example.com/sites/mysite/static/css/style.css。第一條規則是保護髮動機免受無限循環。

注意,如果請求包含多個根頁面(例如,/index/some_another_page/),則只會在第一場比賽前,修剪無法識別的網址塊(由於模式的非貪婪*?)名稱及轉發請求到相應的處理程序(在本例中爲/index/處理程序)。這種行爲可以根據特定網站的需求進行調整。