只使用一种方式在中文中用语言的氛围写mod_rewrite
用mod_rewrite的话,不觉得有点难懂吗?
有时候,我们会在网站迁移或http重定向到https请求页面时使用mod_rewrite,但是说实话,使用的机会并不多,而且因为大家的需求都差不多,所以很多时候我们都会在网上搜索方法,或者向专业人士寻求帮助。虽然我们本应该先充分理解再进行操作,但是独特的表达方式和繁多的选项增加了难度。现在我们来好好理解一下基础知识。
关于语法
这个语法看起来很难,但其实只是因为有许多不熟悉的词汇和选项,写作方式非常简单。
mod_rewrite的基本语法
RewriteEngine on :URL書き換えを宣言
RewriteBase :基準となるパスを設定(今回は説明しない)
RewriteOptions :親子ディレクトリ間での影響範囲を設定(今回は説明しない)
RewriteCond :条件文を設定
RewriteRule :指定したパターンでURLの書き換えを行う
RewriteEngine 打开|关闭
-
- URL書き換えを行う場合には必須
-
- URL書き換えの on | off を設定する
offの場合は、URL書き換えが動作しない
バーチャルホストには継承されないので、それぞれ設定する必要がある
如果重写条件
-
- ルールの条件設定を行う
-
- 書き方はRewriteCond X Y
XはYに一致する場合、の意
RewriteRuleの前に記述
複数記述できる
設定した全ての条件にマッチした場合、指定したRewiteRuleが実行される
サーバー情報やリクエスト情報を取得できる環境変数を使用できる
%{環境変数名}で使用可能
どんな環境変数があるかについてはこちらを参照
重写规则
-
- 書き換えの処理を実行する
-
- 書き方はRewiteRule X Y
前述したRewriteCondとXがマッチした際、Yに書き換える、の意
書き換え内容は正規表現で指定
例子的表达
将HTTP请求重定向到HTTPS。
以下是一个当有一个请求为http://foo.jp/bar/dee时,将其重定向到https的示例。
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</ifModule>
以下是对处理内容的描述:
– 如果不是https方式
– 请求的是http://foo.jp/bar/dee
– 利用%{HTTP_HOST}作为foo.jp
– 利用%{REQUEST_URI}作为/bar/dee
– 进行[R]重定向
– 不再进行[L]以后的处理
设定标志
这些例子中突然出现的[R]或[L]标记会让人觉得很烦。它们被称为标志,附加在RewriteRule的末尾。它们的作用是设置RewriteRule的行为。由于这些标志有大约20个,要全部解释是困难的,所以我将转让给其他人写的文章。
如果请求的URL无效,将其重写为index.php。
以下是在CMS和其他設定中常見的情況。
<Directory /var/www/foo.jp>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
index.phpがリクエストされた場合、何もしないで終了
存在しないファイルがリクエストされた場合、次の条件へ
存在しないディレクトリがリクエストされた場合、次の条件へ
上記条件を満たすリクエストはindex.phpに書き換える
又出现了 -f 或 -d。这些被称为条件模式,用于指定左边的条件。聪明的人可能已经注意到了,-f 表示文件,-d 表示目录。此外,还添加了否定符号!表示如果文件不存在,或者目录不存在,具有这样的意义。关于条件模式,请参考其他人写的文章。
最后
由于 mod_rewrite 非常复杂,难以在一篇文章中对其进行全面解释,但我希望这篇文章能帮助那些对其感到困惑的人。
虽然选项很多,让人觉得有些难以逾越,但每个选项都是非常简单的条件。让我们勇敢地挑战并不要害怕。