【问题标题】:How to debug Apache mod_rewrite如何调试 Apache mod_rewrite
【发布时间】:2012-03-26 19:59:13
【问题描述】:

mod_rewrite 有两个主要问题:

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

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

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

【问题讨论】:

标签: apache mod-rewrite


【解决方案1】:

一个技巧是打开重写日志。要打开它,请在 Apache HTTP Server 主配置或当前虚拟主机文件中尝试这一行(not in .htaccess):

LogLevel alert rewrite:trace6

在 Apache httpd 2.4 mod_rewrite 之前,尚不存在这样的按模块日志记录配置。相反,您可以使用以下日志记录设置:

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

【讨论】:

  • 你不能把它放在 .htaccess 中。你必须把它放在 VirtualHost 配置中。
  • 你也必须有 RewriteEngine On 部分,因为如果你只在 .htaccess 文件中启用它(就像我一样),那么什么都不会记录。
  • apache 2.4 中的日志文件在哪里?
  • 您会在相关的错误日志中找到2.4的日志项。这可能取决于您的配置,但默认的 Debian/Ubuntu 设置将它们放在 /var/log/apache2/error.log
  • 专业提示:记得关闭重写日志。如果你忘记了,你会很快填满你的硬盘,尤其是在生产服务器上。
【解决方案2】:

对于基本的 URL 解析,使用像 wgetcurl 这样的命令行提取器来进行测试,而不是手动浏览器。然后您不必清除任何缓存;只需 向上箭头 并在 shell 中按 Enter 以重新运行测试获取。

【讨论】:

  • 另一个技巧是使用 Chrome 的“色情模式”(Ctl+Shift+N)。当您关闭窗口时,所有缓存的会话上下文都会被丢弃。
  • 我认为 Firefox 的“私人会话”浏览也是如此。但是你是说这个上下文是每个单独的窗口(所以你没有关闭 Chrome?)
  • AFAIK、Chrome 和 Ff 的不同之处在于,Ff 作为单个进程运行,无论是否处于私有模式。使用 Chrome,每个选项卡或窗口都作为单独的进程运行,并且可以单独处于私有模式;关闭一个私人窗口/标签,它的上下文被丢弃。
  • FF 的 PrivateTab 插件可以做到这一点。每个选项卡单独工作。
  • 这个方法也显示重定向!对于无法访问机器 apache 配置文件的人来说很好。
【解决方案3】:

作为mentioned by Ben 的 RewriteLog 指令在 Apache 2.4 中不再可用。

您需要改用 LogLevel 指令。例如,

LogLevel alert rewrite:trace6

Apache Module mod_rewrite, Logging

【讨论】:

  • 与此关联的日志文件在哪里?
  • @CharlesJohnThompsonIII - 日志文件是错误日志(由 ErrorLog 指令指定)。根据文档,您可以使用 grep 获取重写消息:tail -f error_log|fgrep '[rewrite:'
  • 别忘了重启apache
  • 我必须确保将AllowOverride 设置为All
  • 我们把这个sn-p放在哪里?在虚拟主机内部?在 .conf 里面?
【解决方案4】:

基于Ben's answer,您可以在Linux(我的例子中是Debian)上运行Apache 时执行以下操作。

首先创建文件rewrite-log.load

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

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

然后输入

$ a2enmod 重写日志

紧随其后

$ service apache2 重启

当您完成重写规则的调试后,

$ a2dismod rewrite-log && service apache2 restart

【讨论】:

  • 这不起作用。我得到 sandino@envy:~$ sudo service apache2 restart * Restarting web server apache2 [fail] * apache2 configtest 失败。配置测试的输出是:AH00526:/etc/apache2/mods-enabled/rewrite-log.load 第 1 行的语法错误:无效命令“RewriteLog”,可能拼写错误或由服务器配置中未包含的模块定义跨度>
  • @sandino,你运行的是什么 apache 版本?似乎此语法已针对 2.4 进行了更改,请改用:LogLevel warn rewrite:trace8LogLevel info rewrite:trace8 其中 8 可以是 1-8 之间的任何数字
  • AH00526:/etc/apache2/mods-enabled/rewrite 第 1 行的语法错误 无效命令“RewriteLog”
【解决方案5】:

这里是htaccess tester

它显示了针对某个 URL 测试了哪些条件,哪些条件符合条件以及哪些规则得到了执行。

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

【讨论】:

  • 对我来说,它在最后一行显示了一个绿色的已执行规则,没有任何代码。
  • @thombr 你能更准确一点吗?链接失效了?还是工具?究竟是什么行不通?为什么这与这个问题有关?
  • 这告诉我 URL 正在按预期进行转换......但是在实际服务器上我得到一个 404
  • @michael 是您的配置中唯一存在的测试规则吗? mod_rewrite 是否实际安装并处于活动状态?
  • 原来覆盖没有启用
猜你喜欢
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多