Apache rewrite

常用的 Rewrite 规则

把 http 请求重定向到 https:

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

把 example.com 重定向到 www.example.com,即 SEO 中重要的 301 重定向:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

如果你更钟爱 example.com 的形式,可以把 www.example.com 重定向到 example.com:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L] 

说明:

RewriteCond 指令

只有符合 RewriteCond 指令声明的条件,才会继续往下执行 RewriteRule 指令。

RewriteCond TestString CondPattern

一、TestString 是条件判断的对象,常见的 TestString:

server-variables,以%{NAME}的形式,如:

二、CondPatter 是用来匹配 TestString 的正则表达式,如果匹配成功,往下执行 RewriteRule 指令。

三、可以在 CondPattern 后附加 [flags],如:

RewriteRule 指令

RewriteRule 指令会执行实际的 URL 改写:

RewriteRule Pattern Substitution [flags]

一、Pattern 是正则表达式,用来匹配目标 URL。

二、Substitution 是你要用来替换目标 URL 的新 URL,可以用:

三、flags

NE 表示 No Escape,不对特殊字符转义,如:

RewriteRule /anchor/(.+) /page.html#$1 [NE,R]

以上配置会将 /anchor/abc 重定向到 /page.html#abc,如果没有 NE,# 会被转为 %23,这可不是你想要的。