Jex’s Note

Apache

基本設定

/etc/apache2/sites-available/jex.conf :

<VirtualHost *:80>
        ServerName example.com
        ServerAdmin admin@example.com

        DocumentRoot /var/www/jex
        <Directory /var/www/jex>
                RewriteEngine on
                RewriteCond $1 !^(index\.php|static|crossdomain\.xml|robots\.txt|favicon\.ico)
                RewriteRule ^(.*)$ /index.php/$1 [L]

                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all

                ExpiresActive On
                ExpiresByType image/jpg "access plus 10 years"
                ExpiresByType image/jpeg "access plus 10 years"
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        LogLevel warn
</VirtualHost>

啟動 conf

sudo a2ensite jex

Options

  • All: 以下諸功能皆有
  • None: 以下諸功能皆無
  • Indexes: 自動產生目錄的索引, 將Indexes拿掉, 點選連結目錄就不會秀出目錄來, 會改成403 forbidden的訊息頁面, 如果網站下的 public 下有放 symbolic link 就要將此開啟, 才可以被 access
  • Includes: 提供 SSI (Server-Side Inclues) 功能, 即使用Apache的指令在html檔中寫程式, 須先載入 includes_module
  • FollowSymLinks: 遵循符號鏈接, 即能夠連到其它的目錄去執行, 會壓過 SymLinksIfOwnerMatch。
  • SymLinksIfOwnerMatch: 對符號鏈接及其每一層父資料夾, 都進行權限檢查, 當連結檔本身的owner跟連結目的地的owner不同時拒絕存取, 比 FollowSymLinks 更安全
  • ExecCGI: 可以執行CGI程式。
  • MultiViews: 送出多國語言支援的頁面. 此功能必須被明確指定, Options All並不會提供這個功能

打開 Rewrite 模組

cd /etc/apache2
a2enmod
rewrite

設置轉向自訂的404頁面

ErrorDocument 404 /404.php

建立多個virtual host

  1. /etc/apache2/sites-available建立virtual host, ex: test
  2. sudo a2ensite test
  3. sudo service apache2 restart

設定環境變數

多用在不同的virtual host使得每個都擁有不同的環境變數例如:

不同的virtual host要共用同一個環境變數可以在/etc/apache2/apache2.conf設定

SetEnv BRAND test

各別的virtual host變數可在/etc/apache2/sites-available/ 設定:

  <VirtualHost *:80>
    <Directory /var/www>
    ...
    SetEnv BRAND test[n]
    ...
    </Directory>
  </VirtualHost>

php取得apache環境變數:

  echo getenv('BRAND');

如果網址只指到資料夾,不顯示目前資料夾的檔案列表

<VirtualHost *:80>
    Options -Indexes FollowSymLinks
</VirtualHost>

apache2: Could not reliably determine the server’s fully qualified domain name

$ sudo service apache2 restart
[sudo] password for jex:
 * Restarting web server apache2
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

在/etc/apache2/sites-available/default:

ServerName jex.com
<VirtualHost *:80>
    ServerName jex.com
    (...略...)
</VirtualHost>

ServerName宣告為global

在/etc/apache2/httpd.conf加上:

ServerName jex.com

但apache2.conf要記得Include httpd.conf

不存在的virtual host會自動導向(問題發生在將default不存在)

問題: 原本的default被我刪掉了,而加上兩個virtual host

  • w1.test.com
  • w2.test.com

如此一來 w3.test.com 因為不存在,所以會導向w1.test.com

解決方法:

/etc/apache2/sites-available/default 加回來, 即可解決此問題, 當不存在的domain會導向到default

後記 :

  • ServerName變數不可以在每一個virtual host都宣告成global,不然apache會誤判domain
  • 建議ServerName只在default宣告為global變數

apache log

在/etc/apache2/sites-available/default可以找到apache的log存放位置,例如:

ErrorLog ${APACHE_LOG_DIR}/error.log

預設存放在/var/log/apache2/error.log

讓主機上的帳號都有自己的 public 資料夾 - public_html

load /etc/apache2/mods-enabled :

userdir.load

/etc/apache2/mods-enabled/userdir.conf:

 <IfModule mod_userdir.c>
         UserDir public_html
         UserDir disabled root

         <Directory /home/*/public_html>
                 AllowOverride FileInfo AuthConfig Limit Indexes
                 Options MultiViews Indexes FollowSymLinks IncludesNoExec

Indexes、FollowSymLinks

Options -Indexes +FollowSymLinks
  • -Indexes : 不允許顯示檔案目錄結構
  • +FollowSymLinks : 允許使用 .htaccess 檔案 override 預設的設定

特定副檔名忽略同源政策

<Directory> 裡加上

<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
    <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "*"
    </IfModule>
</FilesMatch>

Comments