簡體   English   中英

Apache .htaccess RewriteRule

[英]Apache .htaccess RewriteRule

這是我的情況。 我有一個網絡根目錄和幾個子目錄,可以這樣說:

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

由於某些限制,我需要能夠保留一個域並擁有這樣的單獨文件夾。 這對我來說很好用,但是兩個站點中的許多JS和CSS引用都指向如下內容:

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

因為這些文件是絕對引用的,所以它們正在/ var / www中查找“ js”和“ css”目錄,這些目錄當然不存在。 有沒有一種方法可以使用RewriteRules重定向對絕對引用文件的請求,使其指向正確的子目錄? 我曾嘗試做類似的事情:

RewriteEngine on
RewriteRule ^/$ /site1

要么

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

但是這些都不起作用,甚至重定向到一個目錄也沒有,更不用說同時處理site1和site2了。 我正在嘗試的可能嗎?

編輯:解決方案

我最終適應了喬恩的建議以適應我的情況。 每當添加或刪除新的子目錄時,我都可以以編程方式對.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是一個文件,其中列出了我的所有站點,刪除了“ sitename” cookie,並在選擇了特定站點時將cookie設置為“ sitename = site#”。 我的RewriteConds檢查

  1. 如果請求不是針對/
  2. 如果請求不是針對/index.php的
  3. 如果請求包含cookie“ sitename = site1”
  4. 如果請求不是以“ / site1 /”開頭

如果滿足所有這些條件,則將請求重寫為在請求之前添加“ / site1 /”。 我嘗試在第三個條件中使用一組匹配(\\ w +)而不是“ site1”的條件/規則,然后在第四個條件和規則中引用%1,但這不起作用。 我放棄了,為此解決了。

如果RewriteRules位於您的.htaccess文件中,則需要刪除匹配中的前導斜杠(在將其發送到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]

您需要設置符號鏈接 ,重寫規則將使用它們,以便服務器級別的絕對鏈接可以跟隨到中央站點托管帳戶的符號鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM