PHP實現url重寫和.htaccess

lee_lgw發表於2021-09-09

.htaccess是一個完整的檔名(只有字尾),它是用於Apache伺服器下的配置檔案,當.htaccess檔案放在某一資料夾下,它僅對該資料夾下的檔案和資料夾有效。透過.htaccess檔案,可以配置伺服器實現很多功能,比如錯誤定位,密碼保護,IP拒絕,URL重寫等等。

預設的Apache不支援.htaccess,需要修改Apache的配置檔案httpd.conf,才能使得.htaccess有效。

配置方法:

配置方面:

1. 找到apache的安裝目錄下的conf下的httpd.conf檔案,開啟檔案修改

LoadModule rewrite_module modules/mod_rewrite.so這行程式碼,他前面有個#號,把#號刪掉

2.  找到

   Options FollowSymLinks ExecCGI Indexes

   AllowOverride None

   Order deny,allow

   Deny from all

   Satisfy all

這個節點,把None改為All.節點可能有多個,修改和PHP路徑相關的那個。

3. 重啟apache服務

接下來是建立.htaccess檔案,並在裡面寫配置。Windows中新建檔案的時候,不允許檔案只有字尾,可以採用notepad等工具新建另存為該檔名。

如果要實現URL重寫,配置檔案中採用正規表示式是編寫URL,並使之和常規的php檔案對映。常用的寫法如下:

RewriteEngine on                       //on為開啟,off為關閉

RewriteRule ([a-zA-Z]{1,})-([0-9]{1,}).html$ b.php?action=$1&id=$2

RewriteRule ([a-zA-Z1-9]{1,})/([a-zA-Z1-9]{1,})$ a.php?controller=$1&action=$2

RewriteRule MyController/[a-zA-Z1-9]$ MyController.php?action=$1

ErrorDocument 404 /404.txt

網上找了一篇檔案例舉了常用的5種對映,也可以參考。

product.php?id=12 to product-12.html

RewriteEngine on  
RewriteRule ^product-([0-9]+).html$ product.php?id=$1

Rewriting product.php?id=12 to product/ipod-nano/12.html

RewriteEngine on  
RewriteRule ^product/([a-zA-Z0-9_-]+)/([0-9]+).html$ product.php?id=$2

Redirecting non www URL to www URL

RewriteEngine On

RewriteCond %{HTTP_HOST} ^optimaxwebsolutions.com$  
RewriteRule (.*) [R=301,L]

Rewriting yoursite.com/user.php?username=xyz to yoursite.com/xyz

RewriteEngine  On  
RewriteRule ^([a-zA-Z0-9_-]+)$ user.php?username=$1    
RewriteRule ^([a-zA-Z0-9_-]+)/$ user.php?username=$1

Redirecting the domain to a new subfolder of inside public_html.

RewriteEngine  On  
RewriteCond %{HTTP_HOST} ^test.com$ [OR]    
RewriteCond %{HTTP_HOST} ^    
RewriteCond %{REQUEST_URI} !^/new/    
RewriteRule (.*) /new/$1

示例:

.htaccess檔案內容如下

RewriteEngine on                       //on為開啟,off為關閉

RewriteRule ^([a-zA-Z1-9]{1,})/([a-zA-Z1-9]{1,})$ a.php?controller=$1&action=$2

RewriteRule ^([a-zA-Z1-9]{1,})/([a-zA-Z1-9]{1,})/$ a.php?controller=$1&action=$2

說明:

正規表示式,嚴格匹配類似Controller/Action或者Controller/Action/,對映到a.php

a.php內容

echo "你的controller:".$_GET['controller']."
";

echo "你的action:".$_GET['action'];

?>

輸入

則被解析到

這2個url是等價的。

注意,在對映url後加上查詢字串不影響正常的對映,比如輸入?value=100,也是可以的。

參考文件:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1020/viewspace-2809758/,如需轉載,請註明出處,否則將追究法律責任。

相關文章