測試環境 CentOS 7 64bits
第一次使用到 Apache 的 .htaccess 應該是在設定 WordPress 固定網址設定 – https://benjr.tw/10918
先來看一下 Apache 設定檔 /etc/httpd/conf/httpd.conf 裡面就已經針對部分檔案設定了權限,如 .htaccess 與 .htpasswd 是不能透過網頁讀取的.
<Files ".ht*"> Require all denied </Files>
像是這一類需要設定權限或是要覆蓋原設定時,可以直接把設定寫在 .htaccess 檔案即可,不需重新啟動 http 服務就可立即生效.
AllowOverride 為 All
Apache 預設不使用 .htaccess 做設定,先確認 Apache 網頁資料夾 (預設為 /var/www/html) 權限的 AllowOverride 需設定為 All (使用 .htaccess 權限設定),之後在 .htaccess 設定不需重新啟動 http 服務就可立即生效.
# vi /etc/httpd/conf/httpd.conf <Directory /var/www> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
# systemctl restart httpd
WordPress 固定網址設定
先來看一下範例 WordPress 固定網址的設定.
Wordpress 預設文章網址是長成這樣 https://benjr.tw/?p=4 ,但是我們可以使用固定網址設定,可以讓你的網址變成這樣短 https://benjr.tw/4 ,除了 wordpress 設定外,還需要去設定 .htaccess .
# vi /var/www/html/.htaccess <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L]
如果請求對象是 index.php,則不執行任何動作(防止對 index.php 被重寫) ,並停止處理接下來的規則.
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
這三個敘述表示如果請求對象不是存在的文件或是目錄,都會重新導向給 index.php .
關於 mod_rewrite 參數請參考 https://httpd.apache.org/docs/current/zh-cn/mod/mod_rewrite.html
- RewriteEngine – Enables or disables runtime rewriting engine.
- RewriteBase – Sets the base URL for per-directory rewrites.
- RewriteRule – Defines rules for the rewriting engine.
參數語法:RewriteRule Pattern Substitution [flags]
- Pattern – Pattern 採用與 perl 相容的正規表示式.
- Substitution – The Substitution of a rewrite rule is the string that replaces the original URL-path that was matched by Pattern.
- [flags] – The [L] flag causes mod_rewrite to stop processing the rule set. In most contexts, this means that if the rule matches, no further rules will be processed.關於 Flag 請參考 – https://httpd.apache.org/docs/current/zh-cn/rewrite/flags.html
來看一下剛剛的範例所代表的意思.
- ^index\.php$ – [L]
主要是防止對 index.php (“^” 表示字串必須在行首, “$” 表示字串必須在行尾,在使用非字母時須先使用 \ ,使用 . 需使用為 \.) 被重寫,如果請求對象是 index.php,則不執行任何動作 – (dash),並停止處理接下來的規則 [L]. - . /index.php [L]
使用 . 來代表匹配任意字元除換行符之外.並用 /index.php 來取代,並停止處理接下來的規則 [L].
- RewriteCond – 定義下面所接的重寫規則所需的條件.
參數語法:RewriteCond TestString CondPattern [flags]
- TestString
%{REQUEST_FILENAME} 表示匹配請求的文件或腳本的完整本地文件路徑,其他可用參數,請參考 https://httpd.apache.org/docs/current/zh-cn/mod/mod_rewrite.html#rewritecond - CondPattern
- -f 表示為檔案, !-d 表示不實際存在的檔案.
- -d 表示為目錄, !-d 表示不實際存在的目錄.
- [flags]
關於 Flag 請參考 – https://httpd.apache.org/docs/current/zh-cn/rewrite/flags.html
- TestString
禁止瀏覽 WordPress 檔案和資料夾清單
預設使用者可以看到 wordpress 的檔案與資料夾清單,如下:
要禁止瀏覽 WordPress 檔案和資料夾清單也很簡單,只需要在 .htaccess 檔案加入如下的設定.
# vi /var/www/html/.htaccess Options All -Indexes
設定之後使用者就無法 (Forbindden) 直接透過讀取檔案和資料夾清單
限制特定副檔名檔案被下載
下面範例限制 http://example.com/ 限制使用者儲存特定副檔名檔案 mp4 , mp3 或是 avi 被下載,
RewriteEngine On RewriteCond %{REQUEST_URI} \.(mp4|mp3|avi)$ [NC] RewriteCond %{HTTP_REFERER} !^http://example.com/.*$ [NC] RewriteRule ^.* - [F,L][NC] 表示不管大小寫 case-insensitive .
[L] 停止處理接下來的規則.
[F] 使服務器向客戶端回傳 403 Forbidden 狀態代碼.