2011-11-09 149 views
0

這是我的情況。我有一個Web根目錄和幾個子目錄,讓我們說:Apache .htaccess重寫規則

/var/www 
/var/www/site1 
/var/www/site2 

由於某些限制,我需要保持一個單獨的域,有這樣單獨的文件夾的能力。這將正常工作對我來說,但很多JS和CSS引用兩個站點指向的東西,如:

"/js/file.js" 
"/css/file.css" 

因爲這些文件是絕對引用,他們正在尋找在「JS」和「CSS」目錄/ var/www,這當然不存在。有沒有辦法使用RewriteRules來重定向絕對引用文件的請求,以指向正確的子目錄?我曾嘗試做這樣的事情:

RewriteEngine on 
RewriteRule ^/$ /site1 

RewriteEngine on 
RewriteRule ^/js/(.*)$ /site1/js/$1 
RewriteRule ^/css/(.*)$ /site1/css/$1 

但這些都不能工作,甚至重定向到只有一個目錄,更別提同時處理1和Site2。我正在嘗試可能嗎?

編輯:解

我結束了適應Jon的建議,以適應我的情況。無論何時添加或刪除新的子目錄,我都可以通過編程方式對我的.htaccess文件進行更改。對於每一個「點」,我想,我有以下的部分在我的.htaccess:

RewriteCond %{REQUEST_URI} !^/$ 
RewriteCond %{REQUEST_URI} !^/index.php$ 
RewriteCond %{HTTP_COOKIE} sitename=site1 
RewriteCond %{REQUEST_URI} !^/site1/ 
RewriteRule ^(.*)$ /site1/$1 [L] 

的index.php是列出我所有的網站文件,刪除了「網站名稱」的cookie,並設定一個cookie 「sitename = site#」當選擇特定的一個時。我RewriteConds檢查,

  1. 如果請求不是用於/
  2. 如果請求不是的index.php
  3. 如果請求包含該cookie的「網站名稱= site1的」
  4. 如果請求不以「/ site1 /」開頭

如果滿足所有這些條件,那麼請求會被重寫以在請求前加上「/ site1 /」。我嘗試過在第三個條件中有一組符合(\ w +)而不是「site1」的cond/rules,然後在第四個條件和規則中引用%1,但這不起作用。我放棄了併爲此定下了決心。

回答

1

如果RewriteRules位於.htaccess文件中,則需要刪除匹配中的前導斜槓(apache在將它們發送到mod_rewrite之前將其除去)。這是否工作?

RewriteEngine on 
RewriteRule ^js/(.*)$ /site1/js/$1 
RewriteRule ^css/(.*)$ /site1/css/$1 

編輯:爲了解決註釋:

是,該作品,但是當我做RewriteRule ^(.*)$ /site1/$1,它導致Apache發佈內部服務器錯誤。但對我來說,這似乎應該是個別規則的通用等價物!

什麼與規則發生的事情是,當/something/被改寫爲/site/something/和Apache內部重定向,它就會被再次改寫,以/site/site/something/,然後再次,然後再等

你會需要一個條件補充,是這樣的:

RewriteCond %{REQUEST_URI} !^/site/ 
RewirteRule ^(.*)$ /site/$1 [L] 
+0

是,該作品,但是當我做'重寫規則^ $/site1的/ $ 1',它導致Apache發佈內部服務器錯誤(*)。但對我來說,這似乎應該是個別規則的通用等價物! – denaje

+0

看到我的編輯,它解決了循環。 –

+0

啊,這很有道理。這將適用於一個網站,但我將如何支持多個網站?我嘗試添加'RewriteCond%{HTTP_REFERER}/site /'作爲附加條件,以便在重寫請求之前檢查REFERER。但是這不會超過第一頁,因爲點擊指向/page1.htm的鏈接仍然顯示/page1.htm作爲URI,即使它已被內部重寫到/site/page1.htm。然後,單擊第二個鏈接時,REFERER不正確,並且重寫規則不適用。有什麼建議麼? – denaje

0

您需要設置symlinks,其中重寫規則將使用,以便服務器級別的絕對鏈接可以遵循中央站點託管帳戶的符號鏈接。