2016-09-07 57 views
0

我想爲多個子域與我的web服務器:重新映射請求不同的本地路徑

example.com
projects.example.com
blog.example.com
wiki.example.com
...

文檔根目錄被設置如下:

ServerName example.com 
ServerAlias *.example.com 
VirtualDocumentRoot "/var/www/%0/public" 

該W因爲它會自動將文檔根設置爲相應的子域。然而,我的下一個要求是,它應該檢測文檔根目錄中的public文件夾是否存在,如果不存在,則提前從一個目錄提供文件。

我的大多數應用程序都是用Laravel編寫的,所以他們附帶一個public文件夾,但有時我只想快速創建一個沒有public的新腳本,或部署不支持的外部軟件。

因此的文檔根目錄example.com(這只是提供一個靜態index.htmlstyle.css)應/var/www/example.com/而非/var/www/example.com/public

<If "!-d '/var/www/' . %{HTTP_HOST} . '/public'"> 
    RewriteEngine on 
    RewriteRule^"/var/www/%{HTTP_HOST}" [L,QSA] 
</If> 

這是改寫錯誤日誌的結果:

[rewrite:trace2] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] init rewrite engine with requested uri/
[rewrite:trace1] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] pass through/
[rewrite:trace3] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] add path info postfix: /var/www/example.com -> /var/www/example.com/public/ 
[rewrite:trace3] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] applying pattern '^' to uri '/var/www/example.com/public/' 
[rewrite:trace2] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] rewrite '/var/www/example.com/public/' -> '/var/www/example.com' 
[rewrite:trace1] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] initial URL equal rewritten URL: /var/www/example.com [IGNORING REWRITE] 

正如你所看到的,它正確地映射,但由於某種原因,也不符合我通過重寫規則試過這種從那裏文件(我認爲這是因爲它不會追加index.html或任何類似的東西)。

我該如何解決這個問題?

回答

1

這是因爲核心看到不存在的public /並將其從當前文件名中分離出來並分解到PATH_INFO中。即使[DPI]標誌在這裏也沒有幫助,因爲它在最後一刻刪除了PATH_INFO,作爲重寫的副作用。

不幸的是,你嘗試拋棄PATH_INFO的這種改變被捕獲到了mod_rewrite的「循環檢測」中,並且被誤認爲沒有改變文件名。

你應該反轉你的邏輯,這樣就不會有注入PATH_INFO的偏離。重寫將隨後添加公共後綴而不是刪除它。

這也允許你通過在RewriteCond中使用典型的-d測試來放棄否定和真正的整個。

+0

你能爲我舉個例子嗎?我試着用[這個配置](http://pastebin.com/i7vkfJ16)這對我的理解是你的建議。它仍然會導致循環檢測。如果我爲'RewriteRule'使用'END'標誌,它按預期工作,但顯然不會從我的.htaccess加載更多的重寫規則,因此應用程序的路由在存在'public'文件夾的地方被破壞 – Padarom

+0

這裏有一個錯誤日誌的示例(帶有'rewrite:trace3'級別),當我使用它時沒有'[END]'標誌:http://pastebin.com/c6KDdh5b – Padarom