2017-05-05 54 views
2

我試圖實現,使用.htaccess,所以我可以訪問所有我的項目與一個虛擬主機設置,並在主機文件中定義一個URL的配置。這將允許我在該文件夾中放置一個項目,它將起作用而不需要我做任何其他配置,並在工作時節省大量時間。動態加載子域文件夾作爲根用.htaccess

實施例A:prestige.projects.dev託管在D:/projects/prestige

實施例B:newproject.projects.dev託管在D:/projects/newproject

下面的代碼適用於實施例A的具體情況,但我不瞭解如何使所有項目「動態」工作。我的目標是使prestige成爲通配符。例如:newproject.projects.dev應該自動加載D:/projects/newproject的內容。

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^prestige\.projects\.dev$ 
RewriteCond %{REQUEST_URI} !^/prestige/ 
RewriteRule (.*) /prestige/$1 

只要達到目標,我願意接受其他建議而不是此方法。

回答

2

試着這麼做,而不是執行以下操作:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^([a-z]+)\.projects\.dev [NC] 
RewriteCond "%{REQUEST_URI} /%1" !^(/[^/]+)[^\s]*\s\1$ 
RewriteRule (.*) /%1/$1 [L] 

%1是一個反向引用捕獲的組中最後一個匹配CondPattern

第二個RewriteCond指令是硬編碼檢查的「通配符」版本,以確保REQUEST_URI尚未以與子域相匹配的目錄開始 - 從而防止重寫循環。

%{REQUEST_URI} /%1(其擴展爲第一重寫後的形式是「/<directory>/<anything> /<subdomain>」的字符串)被針對正則表達式^(/[^/]+)[^\s]*\s\1$,它檢查以查看是否/<directory>匹配的字符串相同/<subdomain\1是內部反向引用到在正則表達式中捕獲的組)。只有當這不匹配時,RewriteRule替代纔會發生 - 與您當前的規則工作方式相同。

+0

如果'%{DOCUMENT_ROOT} /%1'是一個目錄,那麼可以添加一個檢查。 –

+0

我已經更新了我的答案。現在這更接近地模仿你對'REQUEST_URI'的檢查,從而避免直接請求重寫子域/目錄(這不需要「REDIRECT_STATUS」檢查)。這仍然允許直接訪問該目錄 - 儘管如果該環境僅用於開發(如果需要,可以實現_外部重定向),這應該不成問題。 – MrWhite

+0

我還沒有實現Olaf建議的目錄檢查,因爲我認爲這會比404更糟糕,而不是默默無聞。除非訪問文檔根(子域)時的默認響應是404響應? – MrWhite

相關問題