Apache – .htaccess

Loading

測試環境 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]
    
    1. Pattern – Pattern 採用與 perl 相容的正規表示式.
    2. Substitution – The Substitution of a rewrite rule is the string that replaces the original URL-path that was matched by Pattern.
    3. [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

禁止瀏覽 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 狀態代碼.

沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料