如何调试Apache mod_rewrite

puk*_*puk 166 apache mod-rewrite

mod_rewrite有两个主要问题:

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

在此输入图像描述

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

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

Ben*_*Ben 270

一个技巧是打开重写日志.要打开它,尝试在你的Apache主配置或当前虚拟主机文件(这些行.htaccess):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
Run Code Online (Sandbox Code Playgroud)

由于Apache httpd 2.4 mod_rewrite RewriteLog和RewriteLogLevel指令已完全被新的每模块日志记录配置所取代.

LogLevel alert rewrite:trace6
Run Code Online (Sandbox Code Playgroud)

  • 你不能把它放在.htaccess中.您必须将其放入VirtualHost配置中. (78认同)
  • apache 2.4中的日志文件在哪里? (11认同)
  • 专业提示:请记得关闭重写日志.如果你忘了你会很快地填满你的硬盘,特别是在生产服务器上. (10认同)
  • 你必须在那里使用`RewriteEngine On`部分,因为如果你只在`.htaccess`文件中启用它(就像我一样),那么什么都不会被记录. (7认同)
  • 您将在相关的错误日志中找到2.4日志项.这可能取决于您的配置,但默认的Debian/Ubuntu设置将它们包含在/var/log/apache2/error.log中 (4认同)
  • 您不能在.htaccess中执行此操作。RewriteLog和ReLogLogLevel仅在服务器配置和虚拟主机上下文中可用 (2认同)
  • 这在 Apache 2.4 中不起作用。在开始浪费时间之前,请查看下面托比亚斯·舒尔茨的回答。 (2认同)

小智 127

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

LogLevel alert rewrite:trace6
Run Code Online (Sandbox Code Playgroud)

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

  • 与此相关的日志文件在哪里? (19认同)
  • @CharlesJohnThompsonIII - 日志文件是错误日志(由ErrorLog指令指定).根据文档,您可以使用grep获取重写消息:`tail -f error_log | fgrep'[rewrite:'` (8认同)
  • 我们把这个片段放在哪里?在虚拟主机内?.conf 里面? (3认同)
  • 不要忘记重新启动apache (2认同)
  • 我必须确保“AllowOverride”设置为“All”! (2认同)

Kaz*_*Kaz 25

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

  • 另一个技巧是使用Chrome"Porn模式"(Ctl + Shift + N).关闭窗口时,任何缓存的会话上下文都会被删除. (14认同)
  • AFAIK,Chrome和Ff的不同之处在于Ff作为单个进程运行,它是否处于私有模式.使用Chrome时,每个标签或窗口都作为单独的进程运行,并且可以单独处于私有模式; 关闭一个私有窗口/选项卡,它的上下文被删除. (2认同)
  • FF 的 PrivateTab 插件可以做到这一点。每个选项卡单独工作。 (2认同)

And*_*ndy 11

htaccess测试仪.

它显示了针对某个URL测试了哪些条件,哪些条件符合标准以及哪些规则已执行.

但它似乎有一些小故障.

  • 这告诉我 URL 正在按预期转换......但是在实际服务器上我得到了 404 (3认同)
  • 对我来说,它显示了最后一行中没有任何代码的绿色执行规则. (2认同)