How to debug .htaccess RewriteRule not working

我有一个 .htaccess文件中的 RewriteRule没有做任何事情。我如何排除这个故障?

  • How can I verify if the .htaccess file is even being read and obeyed by Apache? Can I write an echo "it is working" message, if I do write it, where would that line be echoed out?
  • 如果没有使用 .htaccess文件,我如何让 Apache 使用它?
  • 如果正在使用 .htaccess,但我的 RewriteRule仍然没有效果,我还能做什么来调试?
133864 次浏览

为什么不在你的。Htaccess 文件并尝试重新加载 apache。如果阿帕奇无法启动,你知道它的工作。删除垃圾,然后重新加载阿帕奇,如果它加载祝贺你配置。正确访问。

.htaccess中输入一些垃圾值 e.g. foo bar, sakjnaskljdnas any keyword not recognized by htaccess and visit your URL. If it is working, you should get a

500内部服务器错误

内部服务器错误

The server encountered an internal error or misconfiguration and was unable to complete your request....

我建议你把它放在 RewriteEngine on后不久。


既然你在你的机器上。我假设你有访问阿帕奇 .conf文件。

打开 .conf文件,查找类似于:

LoadModule rewrite_module modules/mod_rewrite.so

如果有注释(#) ,取消注释并重新启动 apache。


重写日志

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

将以上3行放入 virtualhost中。重新启动 httpd。

使用高值的 Level 会大大降低 Apache 服务器的速度!使用级别大于2的重写日志文件仅用于调试! 第9级将记录几乎所有重写日志的细节。


更新

Apache 2.4发生了变化:

来自 Upgrading to 2.4 from 2.2

The 重写日志 and 重写 LogLevel directives have been removed. This functionality is now provided by configuring the appropriate level of logging for the mod_rewrite module using the 日志级别 directive. See also the mod_rewrite logging section.

有关 LogLevel 的详细信息,请参阅 LogLevel 指令

你可以完成

RewriteLog "/path/to/rewrite.log"

以这种方式

LogLevel debug rewrite_module:debug

也许更合乎逻辑的方法是创建一个文件(例如 test.html) ,添加一些内容,然后尝试将其设置为索引页:

DirectoryIndex test.html

在大多数情况下,. htaccess 规则将覆盖在目录/文件级别工作的 Apache 配置

一般来说,.htaccess 中的任何改变都应该有可见的效果。如果没有效果,检查你的配置 apache 文件,比如:

<Directory ..>
...
AllowOverride None
...
</Directory>

应该改成

AllowOverride All

您还可以更改. htaccess 文件中的指令。

“输入一些垃圾值”的回答并没有给我带来好处,尽管输入了垃圾值,我的网站还是继续加载。

相反,我在.htaccess 文件的顶部添加了以下代码行:

deny from all

这会很快让你知道。Htaccess 是否被接收。如果。正在使用 htaccess,该文件夹中的文件根本不会加载。

如果您可以访问 apache bin 目录,

httpd -M首先检查加载的模块。

 info_module (shared)
isapi_module (shared)
log_config_module (shared)
cache_disk_module (shared)
mime_module (shared)
negotiation_module (shared)
proxy_module (shared)
proxy_ajp_module (shared)
rewrite_module (shared)
setenvif_module (shared)
socache_shmcb_module (shared)
ssl_module (shared)
status_module (shared)
version_module (shared)
php5_module (shared)

之后,像 Options -Indexesdeny from all这样的简单指令将巩固.htaccess 正常工作。

要测试您的 htaccess 重写规则,只需填写您正在应用规则的 URL,将您的 htaccess 的内容放在较大的输入区域,然后按下“ Test”按钮。

Http://htaccess.mwl.be/

要回答三个问题中的第一个问题,用一种简单的方法查看。Htaccess 文件是否正常工作将触发一个自定义错误。Htaccess 文件:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

回到你的第二个问题,如果。Htaccess 文件没有被读取,可能是服务器的主 Apache 配置将 AllowOverride设置为 None。Apache 的文档中有 故障排除技巧来解决这个问题和其他可能会阻止。Htaccess 生效。

最后,回答你的第三个问题,如果你需要调试你在重写规则中引用的特定的 变量,或者使用你想要独立于规则进行评估的 表情,你可以做以下事情:

输出您所引用的 变量,以确保它具有您所期望的值:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

表情放入 <If>指令中进行独立测试。这样你就可以确保你的表达方式写得正确或者在你期望的时候是匹配的:

<If "%{REQUEST_URI} =~ /word$/">
ErrorDocument 200 "Your expression is priceless!"
RewriteRule ^ - [L,R=200]
</If>

快乐.htaccess 调试!

检查读取和执行。可以通过 apache 进程访问 htaccess。查看 Apache 的 error _ log 将帮助您对与权限相关的错误进行排序。