关于mod_rewrite的内容
首先
这是一个备忘录,关于不经常接触服务器的人如何进行Apache HTTP Server的设置。内容适用于Apache 2.4.x和Amazon Linux 2环境。
方程
指令清单
https://httpd.apache.org/docs/2.4/mod/directives.html
假设
需要加载rewrite_module。
可以通过httpd -M等命令来进行确认。
Loaded Modules:
… 略 …
rewrite_module (shared)
如果不满足条件,则将以下内容追加到配置文件中。
加载模块重写模块 modules/mod_rewrite.so
在这种情况下,通过在另一个conf文件中添加IncludeOptional指令,可以更容易地进行管理。如果进行了分割,则需要确认是否已加载。
使用httpd -t -DDUMP_CONFIG可以进行确认。
在进行设置后的测试中,IfModule指令非常实用。参考链接:https://httpd.apache.org/docs/2.4/en/mod/core.html#ifmodule
另外,日志输出不能使用RewriteLog和RewriteLogLevel,与2.2版本不同。
在我的环境中,默认值是warn,所以我会将设置提升到最详细的输出。
日志级别为调试(debug),重写为追踪8(rewrite:trace8)。
在以下链接中,记录了有关各级别的详细信息以及如何覆盖特定模块的级别。
https://httpd.apache.org/docs/2.4/zh-cn/mod/core.html#loglevel
若要反映conf文件的变更,请重新启动服务。
sudo systemctl restart httpd.service
写法 (xiě fǎ)
如果没有理由的話,可以直接在conf中进行记录,也可以在htaccess文件中进行设定。在conf的Directory块中和在htaccess中进行记录似乎能够产生相同的效果。在這种情况下,不需要改變AllowOverride。
当指定路径时,请首先确认DocumentRoot指令的指定位置。如果此处不是类似”/var/www/html”的绝对路径,则还需确认ServerRoot。
比如,使用Directory指令括起来的代码块将匹配hoge目录及其子目录下的访问请求,其位于文档根目录的直接下层。
<目录 /hoge>
开启重写引擎
如果请求URI匹配正则表达式^.*/fuga/index\.html$
重写规则为任意内容 https://fuga.com
</目录>
如果在模式部分中使用冒号等标记,需要进行转义。如果多次写入RewriteCond,则默认为AND条件。要更改为OR条件,可以在末尾添加标志,例如:RewriteCond %{REQUEST_URI} ^.*/index.html$ [OR]。
需要注意的是,虽然Location指令也会进行匹配,但由于先应用Directory指令,所以需要注意。