2012-06-17

Apache Alias, Directory, Options, AllowOverride, Order, Allow, Deny 設定

Apache mod_alias 提供好幾個 directives:
  • Alias
  • AliasMatch - Regular Expression 版的 Alias
  • Redirect
  • RedirctMatch - Regular Expression 版的 Redirect
  • RedirectPermanent、RedirectTemp、ScriptAlias、ScriptAliasMatch
今天只想知道 Alias,將特定 url 指向非 Apache 預設的目錄,就是 DocumentRoot 以外的目錄,這是很合理的需求,畢竟每個專案不會想都放在 Apache 的目錄裡。


Alias 處理順序
  • Redirect 先於 Alias
  • 單看 Alias,優先順序以設定檔中的順序決定
舉例來說:
/foo /foo
/foo/bar /foo/bar
就是錯誤的設定順序,因為第二個 Alias 永遠不會被執行,愈精確的 Alias 要放在愈前面

語法
Alias URL-path file-path|directory-path
有趣了,可以指向檔案?那是不是能藉此實做 Front Controller?再研究!

URL-path 區分大小寫。

文件上說 URL-path 結尾有沒有「/」有差別。
Alias /alias /someplace
Alias /alias/ /someplace
若用 http://.../alias 只能連到第一個 Alias,連不到第二個 Alias,但實機測試好像沒差別,即使最後沒有「/」,瀏覽器都會自動加上「/」,不確定是誰動的手腳,為避免夜長夢多,建議用較寬鬆的方式,也就是第一種不加「/」的 Alias 定義方式。

Apache 建議的安全性原則中,對 DocumentRoot 給予最嚴格的存取限制,然後再對各個目錄放寬限制,也就是除了上述 Alias 的定義外,通常要再對 Alias 指向的目錄設存取權限
<Directory "/path/to/other/directory">
Order allow,deny
Allow from all
</Directory>
這是最寬鬆的作法。

最後也是最重要的,第一個參數若以「/」結尾,那第二個參數也要以「/」結尾,同樣的,若第一個參數不以「/」結尾,那第二個參數也不可以「/」結尾,總的來說,兩個參數的結尾方式要一樣
Alias /img/ "/someplace/img"
以上述的錯誤設定來說,http://.../img/hello.png 會對應到 /someplace/imghllo.png,也就是說將 URL 切掉第一個參數後,加上第二個參數,就是這樣造成錯誤的;至於設定權限的 Dorectory 路徑則加不加都沒關係,不會受到 Alias 的影響。

雖然說 Alias 是用來指向 DocumentRoot 以外的檔案,但也沒說不能指向 DocumentRoot 或其子目錄,這種作法可以用來做路徑更名,Alias 只能更改 http://domain.name/ 以後的路徑,若要動到 domain name,可以用 Redirect 或者 Rewrite。

Directory
<Directory directory-path>
...
</Directory>
針對 directory-path 進行專屬的設定(directives),效用及於該目錄與其所有子目錄,常與 Alias 搭配使用。

directory-path 除明文的絕對路徑外,也可以使用 Unix shell style 來指定路徑。
  • ? - 單一字元
  • * - 「/」以外的任何字元
  • [] - 字元範圍
directory-path 也可以使用 Regular Expression 來指定路徑。

如果同一個路徑有多個 Directory 設定時,包括來自上層的設定,設定的順序如下
  • 最短的路徑最先,也就是最模糊的先。
  • 依序套用到最長的路徑,也就是最精確的路徑最後。
  • 然後是每一層的.htaccess,由最上層往下到該層
  • 最後是由 Regular Expression  設定的 Directory,依照在設定檔中的順序套用

Options
Options [+|-]option [[+|-]option] ...
設定指定目錄的功能。
Options All
預設值,擁有除了 MultiViews 以外的所有功能。
Options FollowSymLinks
可以用來取代 Alias,但不建議這麼做,也僅適用於可以建立 Synlinks 的 Unix 系統,也就是在 DocumentRoot 下建立 Symlinks,然後搭配上述的設定就可以將文件放在 DocumentRoot 以外的地方。
Options Indexes
當網址未指定明確的檔案,且 DirectoryIndex 沒有設定或者設定的檔案不存在時,Apache 會列出該層目錄下的所有檔案與目錄。

多用來除錯用,正式環境不建議使用。
Options MultiViews
「Content negotiated "MultiViews" are allowed using  mod_negotiation.」 不懂。
Options None
什麼功能都沒。

同一個目錄若有多個 Options 設定時,最精確的目錄設定優先,因為 Options 可以同時設定多項功能,所以完全是採用最精確的目錄設定,而不是用 merge 的方式。

但可以使用加號「+」與「-」來達成 merge 的效果。

AllowOverride
AllowOverride All|None|directive-type [directive-type] ...
設定 .htaccess 裡可以使用的 directives。

All 表示所有的 directives 都可以用,None 則是完全忽略 .htaccess。

Order, Allow, Deny
Order Allow,Deny
Order Deny,Allow
Order 常用的兩種設定方式,注意逗號前號無空白。

第一種:Order Allow,Deny
  • Allow 與 Deny 皆符合,Deny。
  • 只符合 Allow,Allow。
  • 只符合 Deny,Deny。
  • 皆不符合,Deny。 
Deny 握有生殺大權,適用於嚴格環境,只放行少數,餘通殺。
Order Allow,Deny
Deny from all

或者

Order Allow,Deny
Allow from all
Deny from ip1

或者

Order Allow,Deny
Allow from neil.idv
Deny from www.neil.idv
 第二種:Order Deny,Allow
  • Allow 與 Deny 皆符合,Allow。
  • 只符合 Allow,Allow。
  • 只符合 Deny,Deny。
  • 皆不符合,Allow。
Allow 握有生殺大權,適用於寬鬆環境,只管制少數,餘放行。
Order Deny,Allow
Allow from all

或者

Order Deny,Allow
Deny from ip1
Allow from all

或者

Order Deny,Allow
Deny from neil.idv

Allow from www.neil.idv

沒有留言:

張貼留言