例如:
mydomain.com/site1
mydomain.com/site2
我需要在 /site1 上安裝一個應用程式,它會認為它位于根檔案夾中。(在這種情況下,PHP、js、CodeIgniter,但可以是任何東西)
例如,諸如“/file.jpg”之類的檔案的鏈接/參考(在位于 site1 檔案夾中的代碼中,例如在mydomain.com/site1/code.js 中)將真正從mydomain.com/site1/加載file.jpg 而且代碼也看不到site1 下的任何檔案夾,所以這基本上是根檔案夾。類似的事情會發生在 site2,所以這 2 個是單獨的根檔案夾。
我認為這將是安裝在 mydomain.com/site1 上的某種帶有重定向或某種反向代理的簡單 .htaccess 檔案,但到目前為止我嘗試過的一切都不起作用。即使在堆疊溢位時,我似乎也找不到任何這樣的例子..有什么想法嗎?
uj5u.com熱心網友回復:
最簡單的方法是創建一個額外的 VirtualHost,供內部使用,稱為 internal1,它的 RootDirectory 是,你猜對了,/var/www/mydomain.com/htdocs/site1主站點在/var/www/mydomain.com/htdocs.
然后在 mydomain.com 中,您反向代理/site1到 internal1(您必須將其放入/etc/hostslocalhost 的別名中)。根據請求,第二個請求將使其 DOCUMENT_ROOT 指向site1(并且其 ServerName 更改為 internal1):
ProxyPass /site1/ http://internal1/
ProxyPassReverse /site1/ http://internal1/
(不確定尾部斜杠)
現在,訪問 yourdomain.com/site1/joe.html 將觸發到 internal1/joe.html 的第二個內部連接,其中將包含,例如,'src="/joe.jpg"';這就是 ProxyPassReverse 將發揮作用的地方,在 'src="yourdomain.com/site1/joe.jpg"' 中重寫它,以便一切正常。
勘誤表
以上不正確,感謝@MrWhite 指出這一點。ProxyPassReverse 是不夠的,因為它只重寫headers。從 Apache 檔案(強調我的):
只有上面特別提到的 HTTP 回應頭會被重寫。Apache httpd 不會重寫其他回應頭,默認情況下也不會重寫 HTML 頁面內的 URL 參考。這意味著如果代理內容包含絕對 URL 參考,它們將繞過代理。要重寫 HTML 內容以匹配代理,您必須加載并啟用 mod_proxy_html。
(該方法非常臟:每次 HTTP 呼叫都會導致一個額外的連接和兩次重寫,一次進入,一次更大的外出)。
當然,如果鏈接是使用例如 Javascript 構建的,很可能代理代碼不會將其識別為鏈接,將保持不變,可能在某處帶有“internal1”名稱,并且應用程式將中斷。
但是,@arkascha 有權這樣做-您應該治愈原因,而不是癥狀。您可以重寫應用程式的環境,以便它們即使在子目錄中也可以毫無問題地運行。或者您可以嘗試<base href="https://example.com/site1">在輸出 HTML 中注入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332879.html
