利用apache的mod_rewrite做URL規則重寫
使用mod_rewrite做url重寫,偽靜態,做過很多次,這次用幾個例子記下來,便於後面查用。
使用方法:
1.在conf目錄的httpd.conf檔案中找到:
LoadModule rewrite_module modules/mod_rewrite.so
2.在要支援url rewirte的目錄啟用 Options FollowSymLinks和AllowOverride All
<Directory “D:/WAMP/Mypro/”>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
這樣通過http://localhost/Mypro/訪問時,/Mypro/和其下面的子目錄將支援url rewrite。
3.在Mypro根目錄下新增.htaccess檔案,新增規則:
RewriteEngine on
#針對phpcms的url結構
RewriteRule ^content-([0-9]+)-([0-9]+)-([0-9]+).html index.php?m=content&c=index&a=show&catid=$1&id=$2&page=$3
—————————–
下面給三個淺顯易懂的例子:
<1>
RewriteEngine on
RewriteCond $1 !(index.php|images)
RewriteRule ^(.*)$ /index.php?page=$1 [L]
RewriteEngine on:開啟Rewrite
RewriteCond $1 !(index.php|images):如果檔案不為index.php或目錄不為images。
RewriteRule ^(.*)$ /index.php?page=$1:轉給index.php處理。
$1代表引用RewriteRule中的第一個正則(.*)代表的字元。RewriteCond中的正則很普通,所以不做說明。RewriteRule中的正則,(.*)代表任意字元,^是開始錨,$是結束錨。
設定之後,當訪問dmyz.org/about時,實際是訪問dmyz.org/index.php?page=about,從url中省略掉了index.php。這一規則經常用於框架開發環境,因為大多數框架都是將所有的請求提交給一個入口檔案(通常是index.php)來處理的。
將第三行修改:
RewriteRule ^(.*).htm$ /index.php?page=$1
訪問dmyz.org/about.htm時實際訪問的仍然是dmyz.org/index.php?page=about,這就實現簡單的偽靜態了。
——————————
<2>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /.htm
用這個簡單的例子來說明重寫條件(RewriteCond)使用的伺服器變數和特殊正則。
%{REQUEST_FILENAME}獲得一個伺服器變數的值,!-f是正則,其中感嘆號表否定,-f用來檢測當前值所代表的路徑是否是一個常規檔案。因此例2實現的是:當訪問的檔案不是一個常規檔案時,轉到404.htm頁面。這就是一個簡單的用Rewrite實現404頁面重定向的例子。還可以補充一下,將其修改為:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
#如果當前變數所代表的路徑不是一個常規目錄
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /.htm
——————————
<3>
RewriteEngine on
RewriteCond %{QUERY_STRING} ^pageid=(.*)?$ [NC]
RewriteRule ^index(.*)$ http://dmyz.org/thread.php?fid=%1 [R=,L]
本例中使用了配置指令,和重寫規則對重寫條件的引用。
如例2所說,重寫條件可以使用伺服器變數和特殊正則,但重寫規則不可以。所以需要在重寫規則中反向引用重寫條件的內容。例3中使用%1來反向引用(.*)?。當查詢字串為pageid=任意字串時,跳轉到thread.php?fid=任意字串。這條正則很適合網站搬家、更換程式後,將原地址轉向到新地址。
前兩個例子,重寫條件和重寫規則都只有兩個引數——正則和字串,本例中追加第三個引數,它被稱為標識,跟在重寫條件和重寫規則之後的,作為輔助、補充之用。本例中使用了最簡單三個標識:
[NC]:忽略大小寫。
[L]:結尾標識。停止重寫操作,並不再應用其他重寫規則。防止本條規則被後續規則影響。
[R=301]:利用HTTP 301跳轉。
—————————————————-
一個常見的問題:配置完rewrite後有時會顯示Forbidden You don`t have permission to access /Mypro/blog/ on this server.這樣的錯誤。
加上Options FollowSymLinks就行了,注意不能加Indexes,這個表示顯示目錄(根目錄沒有index.html的情況下就顯示資料夾的目錄結構)。
實際上mod_rewrite是針對目錄的,因此並不需要將httpd.conf中的所有AllowOverride None改為AllowOverride All,Options也一樣。
相關文章
- Nginx URL重寫規則配置詳解Nginx
- ThinkPHP5.0 Linux Apache/Nginx重寫URL配置PHPLinuxApacheNginx
- url規則
- 在 apache 中重寫規則不生效的問題 [No input file specified.] 解決Apache
- nginx偽靜態規則重寫Nginx
- 詳情頁 url 規則
- modsecurity:規則例子:匹配url
- ThinkPHP5 利用.htaccess檔案的 Rewrite 規則隱藏URL中的 index.phpPHPIndex
- Nginx實現URL重寫Nginx
- 重寫遵循的原則
- nginx TP5 URL 重寫Nginx
- 【ASP.NET Core】URL重寫ASP.NET
- servlet的url-pattern匹配規則詳細描述Servlet
- sql改寫優化:簡單規則重組實現SQL優化
- PHP實現url重寫和.htaccessPHP
- IIS SSL認證流程& url重寫
- PbootCMS網站apache偽靜態規則boot網站Apache
- 4.編寫規則
- Laravel重寫資源路由自定義URLLaravel路由
- Spring MVC 基於URL的攔截和對映規則SpringMVC
- 【iis】URL重寫可以引用原地址內容
- 應用Url重寫時CSS引用問題CSS
- LINUX命令列書寫規則Linux命令列
- Makefile-3-書寫規則
- 優雅的實現請求類驗證規則的重複利用(無需繼承,可適用於多個請求類的規則合併)繼承
- mod_rewrite模組
- 易優cms apache伺服器偽靜態規則Apache伺服器
- 重寫遊戲規則:金融中介圈如何改變銀行業(附下載)遊戲行業
- 撰寫論文的十個簡單規則 | PLOS
- 重構複雜條件的規則設計模式 - levelup設計模式
- 手把手教你寫網路爬蟲(7):URL去重爬蟲
- IIS7.0設定 url重寫成html(偽靜態)HTML
- URL重寫(rewrite)的具體實現與異常問題解決
- Oculus Quest 2如何改寫遊戲規則?遊戲
- [P/Invoke] 使用 `SetDllImportResolver`[^1] 改寫 `DllImport` 的庫解析規則Import
- Apache之Rewrite和RewriteRule規則梳理以及http強轉https的配置總結ApacheHTTP
- 在struts2中實現去掉字尾及url重寫
- Laravel Url 生成的使用規範Laravel
- 重構的原則