Apache和Nginx設置偽靜態(URL Rewrite)的方法


Apache 2.x

1、首先我們要確認Apache已經正確加載了mod_rewrite模塊
      檢查httpd.conf中是否有LoadModule Rewrite_module modules/mod_Rewrite.so這段代碼,如沒有請加上。
            <ignore_js_op>1.png 

      可以使用phpinfo確認是否已經正確加載此模塊,如已加載,mod_rewrite會顯示在Loaded Modules中,如圖:
          <ignore_js_op>2.png 

2、策略配置。現有一個網站,根目錄為/var/www/html,動態頁面地址為/list.php?page=123&id=456,現在我們想要的效果是/list-123-456.html

             <ignore_js_op>3.png 
            
      我就用這個網站為例子介紹下具體的配置,在Apache中有兩種方法配置,一是通過httpd.conf文件,二是通過.htaccess文件,策略語句的原理是使用正則表達式來匹配訪問路徑,並按照規則替換成指定的路徑:

使用httpd.conf來配置rewrite策略:

要使用httpd.conf文件來設置偽靜態策略,我們可以直接在httpd.conf中寫入如下代碼,如果您的網站是配置在VirtualHost中,則將這段代碼加到對應的<VirtualHost hostname> <VirtualHost>
標簽內:
<IfModule mod_rewrite.c>
#輸入: list-123-456.html 
#輸出: list.php?page=123&id=456 
RewriteEngine on
RewriteRule ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$1&id=$2
</IfModule>

添加完成后重啟httpd服務后即可生效
使用.htaccess來配置rewrite策略

檢查httpd.conf中的<Directory />標簽配置,確認AllowOverride配置為All,這樣才能啟用.htaccess文件:
<Directory />
Options FollowSymLinks
AllowOverride  Al l
</Directory>
檢查httpd.conf中的AccessFileName參數,確認為.htaccess
AccessFileName  .htaccess
在網站根目錄下建立.htaccess文件,寫入如下內容:
  1. RewriteEngine on 
  2. RewriteRule ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3
復制代碼
保存后重啟httpd服務即可生效

常見問題:
Q:為何都按上面設置了缺還是無法靜態化?
A:很有可能是因為別的目錄設置項覆蓋了<Directory />標簽內的選項,導致.htaccess文件沒起作用。這個問題一般出現在網站根目錄的Directory標簽中,在這個例子中,可以檢查<Directroy "/var/www/html" >標簽內的AllowOverride參數是否設置為All。

Q:.htaccess文件放在網站根目錄,那子目錄也可以實現偽靜態嗎?
A:.htaccess默認對所在目錄下所有子目錄生效,但是如果子目錄中也放置了.htaccess文件,則該子目錄下的訪問規則以子目錄中的.htaccess文件為准。


Nginx:

      Nginx下設置偽靜態方法與Apache差不多,直接在nginx.conf (或者在對應的*.conf) 中找到需設置偽靜態規則的服務器對應字段,在server{ location/{ } }中添加以下代碼:

server {
    listen 80 default_server;
    server_name _;
    location / {
         root /usr/share/nginx/html;
         index index.html index.htm;
         rewrite ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3;
         }
}
添加后重啟Nginx服務即可生效!


正則表達式匹配

      就用上面的例子中的偽靜態策略來簡單解釋下正則表達式在配置的作用:

策略:RewriteRule  ^(.*)list-([0-9]+)-([0-9]+)\.html$   $1list.php?page=$2&id=$3
請求路徑:http://www.abc.com/list-123-456.html 

本策略分成兩段,第一段是使用正則表達式去匹配請 求訪問的路徑,第二段是將匹配后的參數轉化為真實訪問的路徑。策略執行時:^(.*)list-([0-9]+)-([0-9]+)\.html$ 與 /list-123-456.html 這個字符串進行匹配:
  • ^和$字符分別代表了匹配輸入字符串的開始和結束
  • ()中的匹配到的內容會被按順序分配到變量$1 $2 $3中
  • .*匹配任意字符串,且長度從0個到多個,故$1值為/
  • [0-9]+匹配字符0-9,長度1個到多個,故$2和$3分別是123和456

所以最后真實訪問的動態地址為 /list.php?page=123&id=456


上面只是介紹了基本的配置策略,其實這個rewrite規則還有非常多的玩法,例如使用RewriteCond進行域名層面的重寫跳轉,接下來可以找些資料慢慢補充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM