如何调试.htaccess RewriteRule不起作用


115

RewriteRule.htaccess文件中没有任何操作。我该如何解决?

  • 如何验证.htaccessApache是​​否正在读取并遵守文件?我是否可以写回显“正在运行”消息,如果确实将其写回,那条线会在哪里回显?
  • 如果该.htaccess文件没有被使用,如何使Apache使用它?
  • 如果.htaccess正在使用,但RewriteRule仍然没有效果,我还能做些什么来调试?

Answers:


143

输入一些垃圾值即可.htaccess 例如foo barsakjnaskljdnas 任何关键字不是htaccess的认可,并访问您的网址。如果工作正常,您应该得到一个

500内部服务器错误

内部服务器错误

服务器遇到内部错误或配置错误,无法完成您的请求...。

我建议你稍后再说RewriteEngine on


由于您在机器上。我认为您有权访问apache .conf文件。

打开.conf文件,然后查找类似于以下内容的行:

LoadModule rewrite_module modules/mod_rewrite.so

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


日志重写

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

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

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


更新

Apache 2.4中发生了一些变化:

2.2升级到2.4

RewriteLogRewriteLogLevel指令已被删除。现在,可以通过使用LogLevel指令为mod_rewrite模块配置适当的日志记录级别来提供此功能。另请参见mod_rewrite日志记录部分。

有关LogLevel的更多信息,请参阅LogLevel指令

你可以完成

RewriteLog "/path/to/rewrite.log"

现在以这种方式

LogLevel debug rewrite_module:debug

好的,问题是,我试图将重写器添加到.htaccess文件,由于某种原因,它没有使用它。
macha 2012年

@macha尝试以上方法。如果收到内部服务器错误,则表示已启用mod_rewrite(.htaccess)。您在共享主机上吗?
ThinkingMonkey

不,我在本地主机上工作,您是否知道何时加载.htaccess文件?我虽然apache首先会读这本书
macha'2

@macha .htaccess文件永远不会加载。当您尝试访问该文件夹中存在的页面时,它们将由apache访问(如果存在)。
ThinkingMonkey

好的,我的问题是,如果有人请求网页,apache会直接转到服务器端脚本还是会在该文件夹中查找.htaccess文件,然后继续?
macha 2012年

52

“输入一些垃圾值”答案对我而言并没有解决问题,尽管输入了垃圾,我的网站仍在继续加载。

相反,我将以下行添加到了.htaccess文件的顶部:

deny from all

这将迅速让您知道.htaccess是否被拾取。如果正在使用.htaccess,则该文件夹中的文件将根本不会加载。


4
如果您在验证时不介意几秒钟没有任何工作,则这是最简单的测试。
Mordred

1
是的-花了我大约一秒钟的时间来验证我正在处理的网站没有使用.htaccess文件。
bonh 2013年

1
谢谢,就像一个魅力:)节省了我一些调试时间!
马丁·霍夫

32

通常,.htaccess中的任何更改都应具有可见的效果。如果无效,请检查您的配置apache文件,例如:

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

应该改为

AllowOverride All

而且,您将能够更改.htaccess文件中的指令。


谢谢。我在主apache2.conf文件中找到了目录树/ var / www的相关部分
Tim Richardson

6

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

DirectoryIndex test.html

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


4

要回答三个问题中的第一个问题,查看.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调试!


3

如果您有权访问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 -Indexes或的简单指令deny from all将巩固.htaccess的正常运行。



-1

为什么不在您的.htaccess文件中放入一些垃圾,然后尝试重新加载apache。如果apache无法启动,则说明其工作正常。删除垃圾,然后重新加载apache(如果加载正确配置了.htaccess的祝贺)。


7
我不认为如果存在错误的.htaccess,Apache不会启动或运行,因为它只有在有页面请求时才会检查.htaccess。
Andrew
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.