Apache VirtualHost的配置


自從電腦更換為mac后, 一直沒有時間去配置php的環境。導致每次要更改php代碼的時候, 都是本地更改,然后直接推送到服務器上運行 這樣的開發和測試及其耗時且繁瑣, 所以早上特地決定弄好mac下的php開發環境,畢竟磨刀不誤砍柴工,一勞永逸嘛。

下載按照好mamp后,選擇web服務器為apache。更改配置文件httpd.conf,添加相應的加載moudle。打開虛擬配置。httpd-vhost.conf,因為當前的項目存在兩個獨立的項目,分別是front.xxx.local.admin.xxx.local

httpd-vhost.conf配置如下:

#
# Virtual Hosts
#
# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at 
# <URL:http://httpd.apache.org/docs/2.2/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

#
# Use name-based virtual hosting.
#
#NameVirtualHost *:80

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#

<VirtualHost *:80>
    DocumentRoot "/Users/fly_popc/Desktop/code/front/web" 
    ServerName front.xxx.local
    ServerAlias front.xxx.local
    <Directory "/Users/fly_popc/Desktop/code/front/web">
        RewriteEngine on      
        RewriteCond %{REQUEST_FILENAME} !-f  
        RewriteCond %{REQUEST_FILENAME} !-d  
        RewriteRule . index.php 
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/Users/fly_popc/Desktop/code/admin/web" 
    ServerName admin.xxx.local
    ServerAlias admin.xxx.local
    <Directory "/Users/fly_popc/Desktop/code/admin/web">
        RewriteEngine on      
        RewriteCond %{REQUEST_FILENAME} !-f  
        RewriteCond %{REQUEST_FILENAME} !-d  
        RewriteRule . index.php 
    </Directory>
</VirtualHost>

重啟apache后,環境運行正常。

但是...

當訪問后台項目的時候,卻一直路由到了第一個地址上, 也就是apache配置多個域名指向的虛擬主機訪問總是指向第一個虛擬主機。查詢了好幾個帖子后,依然不能解決問題。最后終於了解到有個配置沒有打開,那就是:

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

本着追本溯源的精神, 查詢了下這個配置的意思,得到的原因如下:

 NameVirtualHost 如果沒有這個,<VirtualHost>標簽就沒什么作用。基於域名訪問的情況,若是基於IP訪問的,以第一個指定IP的VirtualHost為准,每個IP可以單獨指定)一個NameVirtualHost 可以對用多個<VirtualHost>,每個<VirtualHost>必須有自己的NameVirtualHostNameVirutalHost *:80制定這個主機的IP和端口,如果服務器上有多個IP,就可以制定某個IP的某個端口是哪個主機。(新版的Apache已經去除了NameVirtualHost 這個配置,因為確實沒什么用,參數在VirtualHost中都已經指明了)。

至此打開瀏覽器,分別訪問http://front.xxx.local 和http://admin.xxx.local 都能各自訪問到對應的頁面,大功告成!下面記錄下整個流程.

1.先要在httpd.conf(這個是Apache 總的配置文件)中,將虛擬路徑的注釋去掉。
#Include etc/extra/httpd-vhosts.conf
使httpd-vhosts.conf文件起作用,或者直接在httpd.conf中寫配置也可以,但不建議這么做。
相關的配置有:Listen NameVirtualHost <VirtualHost>

2.Listen要監聽的端口,多個端口,要寫多個Listen;否則Apache啟動的時候,不會啟動相應的套接字。

比如

Listen 80
Listen 8080

 

3.NameVirtualHost 如果沒有這個,<VirtualHost>標簽就沒什么作用。

4.最關鍵的VirtualHost。
重要:Apache 在接受到請求時,首先會默認第一個VirtualHost,然后再找匹配的,如果沒有匹配的,就是第一個VirtualHost起作用。
因此在httpd.conf中,將<Dicrectory />(這個是所有目錄的默認配置)
和<Direcotry /opt/lampp/htdocs>的權限,都是deny from all.作為默認;或者直接在httpd.conf中配置

<Directory />
    Options Indexes FollowSymLinks 
    AllowOverride All 
</Directory>

至此,項目就能正常運行起來了!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM