如何调试Apache mod_rewrite


171

我使用mod_rewrite存在两个主要问题:

1)我的规则无效时,没有报告有意义的错误

在此处输入图片说明

2)为了可靠地测试每个修改,我必须清除chrome的缓存。这不是火箭科学,但我必须按Ctrl + Shift + Delete,然后单击“确定”,然后关闭窗口并重新加载。

我想看看是否有任何大师愿意分享他们的秘密,以有效地管理mod_rewrite代码。


1
Puk,请参阅stackoverflow.com/questions/9153262/…,在此我讨论一些标准技巧。
TerryE 2012年

Answers:


283

一种技巧是打开重写日志。要打开它,请在您的apache主配置或当前虚拟主机文件(不在.htaccess)中尝试以下行:

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

从Apache httpd 2.4 mod_rewrite开始, RewriteLog和RewriteLogLevel伪指令已被新的按模块记录配置完全取代。

LogLevel alert rewrite:trace6

81
您不能将其放在.htaccess中。您必须将其放在VirtualHost配置中。
Attila Szeremi

7
您也必须在该RewriteEngine On部分中设置该部分,因为如果仅在.htaccess文件中启用它(就像我一样),那么将不会记录任何内容。
chacham15

12
apache 2.4中的日志文件在哪里?
查尔斯·约翰·汤普森三世

4
您将在相关的错误日志中找到2.4日志项。这可能取决于您的配置,但是默认的Debian / Ubuntu设置在/var/log/apache2/error.log中有它们
Josiah

10
专家提示:请记住要关闭重写日志记录。如果您忘记了,则会很快将硬盘填满,尤其是在生产服务器上。
约翰·亨特2015年

132

Ben提到的LogRewrite指令在Apache 2.4中不再可用。您需要改用LogLevel指令。例如

LogLevel alert rewrite:trace6

参见http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging


22
与此相关的日志文件在哪里?
查尔斯·约翰·汤普森三世

8
@CharlesJohnThompsonIII-日志文件是错误日志(由ErrorLog指令指定)。根据文档,您只能使用grep来获取重写消息:tail -f error_log|fgrep '[rewrite:'
billynoah 2015年

1
别忘了重新启动apache
会计师م

1
我必须确保AllowOverride设置为All
迈克尔”

25

对于基本的URL解析,请使用类似wget或的命令行提取程序curl进行测试,而不是使用手动浏览器。然后,您不必清除任何缓存;只需向上箭头,然后在shell中输入即可重新运行您的测试抓取。


14
另一个技巧是使用Chrome的“色情模式”(Ctl + Shift + N)。当您关闭窗口时,所有缓存的会话上下文都会被删除。
TerryE 2012年

我认为Firefox的“私人会话”浏览也可以。但是您是说这个上下文是针对每个窗口的(因此您不关闭Chrome吗?)
Kaz 2012年

2
AFAIK,Chrome和Ff的不同之处在于,Ff可以作为单个进程运行,也可以不在私有模式下运行。使用Chrome,每个标签页或窗口都作为一个单独的进程运行,并且可以分别在私有模式下运行;关闭私有窗口/选项卡,并且上下文已被删除。
TerryE 2012年

1
FF的PrivateTab插件可以执行此操作。每个选项卡分别工作。
Javid 2014年

此方法还显示重定向!非常适合无法访问机器apache配置文件的人。
杰夫·萨瓦

14

htaccess测试仪

它显示了针对特定URL测试了哪些条件,满足条件的条件以及执行了哪些规则。

不过,它似乎有一些故障。


2
对我来说,它在最后一行显示了一条绿色的执行规则,没有任何代码。
安迪2015年

@thombr,你能更精确吗?链接不起作用?还是工具?到底什么不起作用?为什么在这个问题中与此相关?
安迪

1
这告诉我,URL正在按预期方式进行转换...但是,在实际的服务器上,我得到的是404
Michael

@michael是您配置中唯一存在的测试规则吗?mod_rewrite是否已实际安装并处于活动状态?
安迪

原来覆盖未启用
迈克尔

3

根据Ben的回答,您可以在Linux上运行apache时执行以下操作(在我的情况下为Debian)。

首先创建文件rewrite-log.load

/etc/apache2/mods-availabe/rewrite-log.load

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

然后输入

$ a2enmod重写日志

其次是

$ service apache2重新启动

当您调试完重写规则后

$ a2dismod rewrite-log &&服务apache2重新启动


这没有用。我得到sandino @ envy:〜$ sudo服务apache2 restart *重新启动Web服务器apache2 [失败] * apache2 configtest失败。配置测试的输出为:AH00526:/etc/apache2/mods-enabled/rewrite-log.load的第1行的语法错误:无效的命令“ RewriteLog”,可能是服务器配置中未包含的模块拼写错误或已定义
sandino

3
@sandino,您正在运行哪个Apache版本?似乎此语法已更改为2.4,改为使用:LogLevel warn rewrite:trace8LogLevel info rewrite:trace88可以是1-8中的任何数字
insaner
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.