iT邦幫忙

1

Apache 多站點設定問題

  • 分享至 

  • xImage

在做laravel專案的時候,想要將不同的laravel專案切成不同的url,目前已經申請了固定IP
並且跟網路中文買了ip對應的DNS服務。

在一個固定ip的情況下,可以一個固定IP,藉由/後的不同的網址目錄
對應同一台電腦下的不同資料夾嗎?
*

PS:不是多個域名,對應一個電腦底下不同資料夾專案。

舉例 www.exname.tw 會指到我的固定IP,並使用apache對外設定了一個基本目錄 c:/website/www

Apache原設定:

ServerRoot "c:/Apache24"
ServerName localhost
Listen 80
<Directory />
Order Allow,Deny
Allow from all
</Directory>
DocumentRoot "c:/website/www"
<Directory "c:/website/www">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

原本都在這個資料夾底下使用不同的資料夾再用網址進入
EX:
c:/website/www/a/public
c:/website/www/b/public

在網址打入不同的
以上情況用 www.exname.tw 去進入不同專案的網址都是可以的。
EX:
www.exname.tw/a/public
www.exname.tw/b/public

-----------------------------分隔線------------------------

現在想要藉由用apache來切分站點,上網爬了相關文章有點疑惑
ServerName後面可以用/ 再切分不同的網址嗎?

<VirtualHost *:80>
    ServerName www.exname.tw/a
    # 設定該網站的別名,即通過以下域名也能夠訪問
    ServerAlias "www.exname.tw/a"
    DocumentRoot "c:/website/www/a/public"
    # 屬性須要和DocumentRoot一致
    <Directory "c:/website/www/a/public">
        Options All
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName www.exname.tw/b
    # 設定該網站的別名,即通過以下域名也能夠訪問
    ServerAlias "www.exname.tw/b"
    DocumentRoot "c:/website/www/b/public"
    # 屬性須要和DocumentRoot一致
    <Directory "c:/website/www/b/public">
        Options All
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

看了這篇說明的設定,有點疑惑:http://blog.xuite.net/tolarku/blog/485166953-Apache+Virtual+Host+%E5%A4%9A%E7%B6%B2%E5%9F%9F%E7%B6%B2%E7%AB%99%E6%94%BE%E7%BD%AE%E5%9C%A8%E5%90%8C%E4%B8%80%E5%8F%B0%E4%B8%BB%E6%A9%9F%E4%B8%8A

第一個問題:
在網址列輸入www.exname.tw/a 或者 www.exname.tw/b
都會顯示404錯誤,
但如果在網址列輸入www.exname.tw/a/public
從最底層的路徑進去是可以的,ServerName可以設定/後的目錄網址指向的位置嗎?
還是設定部分有什麼地方理解錯誤呢?

第二個問題:
現在輸入localhost ,不會進入最基本的目錄夾
會直接導向第一個設定的www.exname.tw/a 網站。

再麻煩大家幫忙解惑一下

weiclin iT邦高手 4 級 ‧ 2018-08-12 05:28:35 檢舉
關鍵字: apache alias
您好 有看到您之前回應這編文章的說明 目前也在研究alias的用法 謝謝
https://ithelp.ithome.com.tw/m/questions/10183424
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
Ray
iT邦大神 1 級 ‧ 2018-08-12 13:13:07
最佳解答

Server name 只能用 FQDN, 後面不能帶其他的 URI.

所以你的

ServerName "www.exname.tw/a"
或
ServerName "www.exname.tw/b"

必須改成:

ServerName "wwwa.exname.tw"
或
ServerName "wwwb.exname.tw"

然後 ServerAlias 都拿掉...

這樣 http://wwwa.exname.twhttp://wwwb.exname.tw 就可以分別執行不同目錄的程式

如果你想要的是:
www.exname.tw/a/public
www.exname.tw/b/public
這樣的話, 那就不需要用 Virtual host 指令 (因為你的 host name 都是 www.exname.tw, 沒有改變), 而是要用 .htaccess 的 Rewrite Rule 去解析後面的 a/b 字串之後, 才能導向到指定的目錄去.

看更多先前的回應...收起先前的回應...

抱歉我有點不是很理解,我在買網路中文服務的時候,有購買域名,並使用DNS代管服務,將網址指向固定IP,類似59.127.xxx.xxx 指向域名 "exname.tw " 。

使用這兩種方式的情況下
我現在依照您的說法將
ServerName wwwa.exname.tw
ServerAlias "wwwa.exname.tw"
但在網址上打入wwwa.exname.tw 是無法正常顯示的的,
是不是應該要將ServerName指向我的固定IP?

<VirtualHost *:80>
    ServerName wwwa.exname.tw
    # 設定該網站的別名,即通過以下域名也能夠訪問
    ServerAlias "wwwa.exname.tw"
    DocumentRoot "C:/website/www/laravel55/shop55/public"
    # 屬性須要和DocumentRoot一致
    <Directory "C:/website/www/laravel55/shop55/public">
        Options All
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
Ray iT邦大神 1 級 ‧ 2018-08-12 19:19:30 檢舉

wwwa 也要在 DNS 裡面佔一個 A record 的 IP,
wwwb 也要在 DNS 裡面佔一個 A record 的 IP,

所以, 你會需要設定 wwwa 指向 IP 59.127.xxx.xxx, 同時 wwwb 也指向 IP 59.127.xxx.xxx, 因為這兩個都是指向同一台伺服器.

若你沒有在 DNS 內設定 wwwa 和 wwwb 的話, 外界是查不到他們跟 IP 之間的關聯...這是 DNS 沒設定好, 不是你的 apache conf 問題.

我剛剛試了一下設定這樣的子的情況下,
www.exname.tw/shop55 可以訪問到正確的首頁
但是如果是下層的目錄環境 www.exname.tw/shop55/login
就會顯示路徑錯誤?

Alias /shop55 "C:/website/www/laravel55/shop55/public"
<Directory "C:/website/www/laravel55/shop55/public">
Options All
AllowOverride All
Require all granted

Alias /white55 "C:/website/www/laravel55/white55/public"
<Directory "C:/website/www/laravel55/white55/public">
Options All
AllowOverride All
Require all granted

http://phorum.study-area.org/index.php?topic=21235.0
上網爬了一下相關的說明,有點疑惑

如果照上面的設定方式,應該是/shop55 後面在接的參數會導向對應的route?
像是/shop55 是導向我的public首頁。

如果想要進去登入頁面shop55/這邊不同的param
應該不用再設定Alias?
舉例 /shop55/login 應該會等於
原本網址的 www.exname.tw/shop55/login ?

但實際測試發現只有設定/shop55 可以導向首頁。
後面shop55/不同參數頁面 都會顯示找不到網頁

研究了許久,找到了對應的解決方案。
首先我在httpd.conf設定

Alias /shop55 "C:/website/www/laravel55/shop55/public"
<Directory "C:/website/www/laravel55/shop55/public">
</Directory>
 
Alias /white55 "C:/website/www/laravel55/white55/public"
<Directory "C:/website/www/laravel55/white55/public">
</Directory>

在對應的public底下使用了.htaccess檔案 並寫入RewriteBase /Alias name

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
 
    RewriteEngine On
 
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]
 
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
 
    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteBase /white55
</IfModule>

感謝大家的幫忙謝謝。

我要發表回答

立即登入回答