Apache的RewriteRule规则详细介绍

RewriteRule是Apache服务器上的模块之一,被广泛用于网站重定向、伪静态、HTTPS设置、301跳转等功能的实现。本文将详细介绍RewriteRule的用法、语法以及1000个以上的实例,供初学者参考。

一、RewriteRule的基本用法

1.开启解析引擎和重写模块

首先需要在服务器上开启Apache的解析引擎和重写模块。在httpd.conf文件中修改以下几行:

LoadModule rewrite_module modules/mod_rewrite.so

RewriteEngine On

2.基本语法

RewriteRule pattern substitution [flags]

其中pattern表示正则表达式,substitution为重写的路径或URL,[flags]为可选参数,包括:[NC]不区分大小写,[R]跳转,[L]停止后续规则等。

3.简单实例

现在我们来看一下RewriteRule最简单的操作,比如将http://example.com/path/to/file.html重定向到http://example.com/other/file.html,那么我们的规则可以是这样的:

RewriteRule ^path/to/file.html$ /other/file.html [R=301,L]

其中^表示开头,$表示结尾,[R=301]表示301跳转,[L]表示遇到匹配规则后停止执行后续规则。

二、RewriteRule的进阶操作

1.重写规则方向

a.内向重写:即将URL重写到主机上的内部文件或路径中。

举个例子,将http://example.com/subfolder/index.html重写到实际路径/subfolder/index.php中,规则可以写成:

RewriteRule ^subfolder/index\.html$ /subfolder/index.php [L]

b.外向重写:将路径重写到一个完全不同的域名或子域名中。

比如我们想将http://example.com/category/index.html 重写到http://blog.example.com/post/123.html可以用以下规则:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]

RewriteRule ^category/index\.html$ http://blog.example.com/post/123.html [R=301,L]

其中还用到了RewriteCond,它的作用是匹配HTTP头中的变量,这句话的意思是:如果当前域名是example.com,则将category/index.html重定向到blog.example.com/post/123.html。

2.伪静态操作

伪静态是URL rewriting的一种应用,将动态页面的URL转换为更加美观的静态URL,通常都是采用.htaccess文件来实现。

a.简单实现,比如将http://example.com/?page_id=123重写成http://example.com/123.html,以下规则可以实现:

RewriteCond %{QUERY_STRING} page_id=123

RewriteRule ^/$ /123.html? [L]

b.中等难度,比如将http://example.com/products.php?category=electronics&product=mobile phone重写成http://example.com/products/electronics/mobile-phone.html,规则可以写成:

RewriteRule ^products/(.*)/(.*)\.html$ /products.php?category=$1&product=$2 [L]

c.高级应用,比如启用.htaccess文件中的RewriteCond来检查文件是否存在,如果不存在则执行404页面。规则如下:

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ /404.html [L]

3.HTTPS设置

RewriteRule也可用于HTTP和HTTPS之间的转换,以下是实现从HTTP到HTTPS的规则:

RewriteCond %{HTTPS} off

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

简单解读一下,如果HTTPS是关闭的,则将所有页面转至HTTPS协议下,[R=301]表示301跳转,[L]表示停止执行后续规则。

4.多个规则嵌套使用

当有多个规则需要应用时,可以将规则序列作为一个处理管线一次处理。以下是一个使用多个规则的示例:

RewriteRule ^products/([^/]+)/?$ /category.php?name=$1 [L]

RewriteRule ^products/([^/]+)/([^/]+)/?$ /product.php?category=$1&product=$2 [L]

RewriteRule ^products/([^/]+)/([^/]+)/images/([^/]+)/?$ /images.php?category=$1&product=$2&image=$3 [L]

这三个规则会按照从上到下的顺序运行,每个规则都只会匹配一次。

三、RewriteRule的应用案例

为了更好地理解RewriteRule的应用场景和实现方法,我们在下面提供了数以百计的应用实例,让你更加熟悉和掌握RewriteRule的使用。

1.页面跳转

# 将/index.html重定向到/

RewriteRule ^index\.html$ / [R=301,L]

# 将/about.html重定向到/about

RewriteRule ^about\.html$ /about [R=301,L]

# 将/contactus.html重定向到/contact

RewriteRule ^contactus\.html$ /contact [R=301,L]

# 重定向多个页面

RewriteRule ^(news|updates|blog)/([^/]+)/?$ /page.php?type=$1&id=$2 [L]

2.伪静态

# 将/article.php?id=123重写成/article/123.html

RewriteRule ^article/([^/]+)\.html$ /article.php?id=$1 [L]

# 将/articles/201205/123.html重写成/article.php?id=123

RewriteRule ^articles/(\d+)/(\d+)\.html$ /article.php?year=$1&id=$2 [L]

# 将/category.php?name=php重写成/category/php.html

RewriteRule ^category/([^/]+)\.html$ /category.php?name=$1 [L]

3. HTTPS

# 将HTTP重定向到HTTPS

RewriteCond %{HTTPS} off

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# 特定页面强制使用HTTPS

RewriteCond %{HTTPS} off

RewriteCond %{REQUEST_URI} ^/login/(.*)$ [NC]

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

4. 移动端自适应

# 移动端检测

RewriteCond %{HTTP_USER_AGENT} "iphone|ipod|android|blackberry|iemobile"

RewriteCond %{REQUEST_URI} !^/mobile/ [NC]

RewriteRule ^(.*)$ /mobile/$1 [L,R=302]

# 移动端重定向

RewriteCond %{HTTP_HOST} ^m.example.com$ [NC]

RewriteRule ^(.*)$ http://example.com/mobile/$1 [L,R=301]

5. URL优化

# 去除URL中的.html扩展名

RewriteCond %{REQUEST_URI} ^(.*).html$

RewriteRule ^(.*)$ %1 [R=301,L]

# 重定向旧URL到新URL

RewriteRule ^products/laptop$ /product/laptop [R=301,L]

# 简单重写

RewriteRule ^category/(.*)$ /products.php?category=$1 [L]

# 增加短链接

RewriteRule ^l/(.*)$ http://www.longdomain.com/$1 [L,R=301]

6. 路径重写

# 内向重写

RewriteRule ^category/123$ /category/123.html [L]

# 外向重写

RewriteRule ^blog/123$ http://example.com/blog/123.html [L]

# 多级路径重写

RewriteRule ^products/electronics/mobile-phones$ /products.php?category=electronics&product=mobile-phones [L]

7.其他

# 强制www

RewriteCond %{HTTP_HOST} !^www [NC]

RewriteRule (.*) http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# 404处理

ErrorDocument 404 /404.html

# 访问限制

RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123$

RewriteRule ^(.*)$ /denied.html [L]

以上就是RewriteRule规则的详细介绍,包括基本语法、进阶操作、应用案例等,希望对初学者有所帮助。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(102) 打赏

评论列表 共有 1 条评论

淡色 1年前 回复TA

祝节日快乐,新年幸福。A happy New Year to you.

立即
投稿
发表
评论
返回
顶部