- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業(yè)務(wù)經(jīng)營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯(lián)網(wǎng)協(xié)會理事單位
- 安全聯(lián)盟認證網(wǎng)站身份V標(biāo)記
- 域名注冊服務(wù)機構(gòu)許可:滇D3-20230001
- 代理域名注冊服務(wù)機構(gòu):新網(wǎng)數(shù)碼
在Web開發(fā)中,通常設(shè)置HTTP能在URL不映射文件系統(tǒng)中的文件時訪問資源。 雖然可以在某種程度上使用重定向語句來解決這個問題,但是許多部署對于URL重寫具有更復(fù)雜的需求。 Apache的mod_rewrite提供重寫功能?以便用戶使用簡潔明了的URL進行交互,同時仍然能夠為管理員提供他們認為合適的網(wǎng)站目錄架構(gòu)。
在
RewriteEngine on
您可以創(chuàng)建任意數(shù)量的重寫規(guī)則。 這些規(guī)則提供了服務(wù)器比較入站請求的模式。 如果請求與重寫模式匹配,則服務(wù)器按照規(guī)則所述修改請求,并處理該請求。 下面是一個重寫規(guī)則的例子:
RewriteRule ^post-id/([0-9]+)$ /posts/$1.html
讓我們解析這條規(guī)則:首先,請注意,第一個字符串是匹配傳入請求的模式。 第二個字符串指定要提供的實際文件。 Mod_rewrite模式使用正則表達式語法:^匹配字符串的開頭,$匹配字符串的結(jié)尾,這意味著重寫引擎不會重寫與模式部分匹配的字符串。
上面的例子會重寫指定以/post-id/開頭的路徑的所有URL,并包含一個或多個數(shù)字(例如[0-9]+),在/posts/目錄中提供相應(yīng)的.html文件。 模式中的括號術(shù)語指定了作為$1,$2,$3等傳遞給第二個字符串的變量。
您可以創(chuàng)建和應(yīng)用多個重寫規(guī)則,但這些規(guī)則是順序匹配的。 表示RewriteRules的順序可以影響匹配的規(guī)則。
或者,您可以插入RewriteBase指令來修改重寫規(guī)則的行為。 讓我們假設(shè):
這些指令是為/srv/www/example.com/public_html/目錄指定的。
某些用戶以http://www.tjdsmy.cn/post-id/200形式發(fā)送請求,其中200可能是長于一位數(shù)的任何數(shù)字。
某些用戶以http://www.tjdsmy.cn/page/title-of-page的形式發(fā)送請求,其中“title of page”可能代表任何字符串。
這些文件位于/srv/www/example.com/public_html/objects/上,匹配請求文件名稱,擴展名為.html。
RewriteEngine on RewriteBase /objects RewriteRule ^post-id/([0-9]+)$ $1.html RewriteRule ^page/([^/]+)$ $1.html
上面的重寫規(guī)則集作用如下:
http://www.tjdsmy.cn/post-id/200/,提供位于/srv/www/example.com/public_html/objects/200.html的文件
http://www.tjdsmy.cn/page/free-the-toast/,提供位于/srv/example.com/public_html/objects/free-the-toast.html的文件
使用RewriteCond參數(shù),您可以限制使用RewriteRule的條件。 讓我們從WordPress應(yīng)用程序的默認重寫規(guī)則中獲取以下示例:
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
在此示例中,以上下文的頂層開始的所有請求都受重寫規(guī)則的影響。 這由RewriteBase /指令指定。 上下文由在虛擬主機,目錄塊或.htaccess文件中指定偽指令的位置決定。
RewriteCond語句指示Apache僅當(dāng)滿足條件時才應(yīng)用遵循的規(guī)則。 在上述示例中,匹配請求的文件名稱在文件系統(tǒng)上不存在(例如,!-f),或者目錄不存在(例如!-d)的請求。
簡而言之,如果兩者都為真,并且文件和目錄都不存在,則Web服務(wù)器將請求附加到index.php。 也就是說,f用戶請求http://www.tjdsmy.cn/?post=123或http://www.tjdsmy.cn/post/123,服務(wù)器將返回index.php?post=123或index.php/post/123。
mod_rewrite設(shè)置響應(yīng)碼
最后,有一些代碼,你可以附加到一個RewriteRule,修改重寫的行為。 在前面的例子RewriteRule ./index.php [L],我們看到代表“最后規(guī)則”的[L]選項。 這阻止Apache應(yīng)用任何其他重寫規(guī)則。 最常見的附加選項包括:
F告訴客戶端該URL被禁止,用HTTP代碼403響應(yīng)。
N強制mod_rewrite重新開始重寫過程,并允許多階段重寫。
R告訴客戶端所請求的頁面已?移動,具有用于臨時重定向的HTTP代碼302。 要表示該網(wǎng)頁已永久移動,請指定“R=301”。
您可以在RewriteRule結(jié)尾處指定多個選項,用逗號分隔它們,如:[L,R=301]
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP