自從電腦更換為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>
至此,項目就能正常運行起來了!