如何调试.htaccess RewriteRule无法正常工作

mac*_*cha 113 apache .htaccess mod-rewrite

我有一个RewriteRule.htaccess未采取任何文件.我该如何解决这个问题?

  • 如何验证.htaccessApache是​​否正在读取和遵守该文件?我可以写一个回音"它正在工作"的消息,如果我写它,那条线会被回显出去吗?
  • 如果.htaccess没有使用该文件,我该如何让Apache使用它?
  • 如果.htaccess正在使用但我RewriteRule仍然没有效果,我还可以做多少调试?

Thi*_*key 142

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

500内部服务器错误

内部服务器错误

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

我建议你不久之后再说RewriteEngine on.


因为你在你的机器上.我认为你可以访问apache .conf文件.

打开.conf文件,找一条类似于的行:

LoadModule rewrite_module modules/mod_rewrite.so
Run Code Online (Sandbox Code Playgroud)

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


要记录重写

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9
Run Code Online (Sandbox Code Playgroud)

把以上三行放在你的virtualhost.重启httpd.

RewriteLogLevel 9对Level使用较高的值会大大减慢Apache服务器的速度!仅在大于2的级别使用重写日志文件进行调试!9级将记录几乎每个重写细节.


UPDATE

Apache 2.4中的情况发生了变化:

2.2升级到2.4

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

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

你可以完成

RewriteLog "/path/to/rewrite.log"
Run Code Online (Sandbox Code Playgroud)

现在以这种方式

LogLevel debug rewrite_module:debug
Run Code Online (Sandbox Code Playgroud)


cai*_*ona 48

"输入一些垃圾值"的答案对我来说并不起作用,尽管输入了垃圾,我的网站仍在继续加载.

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

deny from all
Run Code Online (Sandbox Code Playgroud)

如果正在接收.htaccess,这将很快告诉您.如果正在使用.htaccess,则该文件夹中的文件根本不会加载.

  • 如果您在验证时不介意几秒钟没有工作,这是最简单的测试. (2认同)

jgp*_*s2w 32

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

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>
Run Code Online (Sandbox Code Playgroud)

应该改为

AllowOverride All
Run Code Online (Sandbox Code Playgroud)

并且您将能够更改.htaccess文件中的指令.


Cez*_*Cez 5

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

DirectoryIndex test.html
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*erA 5

要回答三个问题中的第一个问题,查看 .htaccess 文件是否正常工作的一种简单方法是在 .htaccess 文件的顶部触发自定义错误:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]
Run Code Online (Sandbox Code Playgroud)

关于您的第二个问题,如果 .htaccess 文件未被读取,则服务器的主要 Apache 配置可能已AllowOverride设置为None. Apache 的文档提供了针对该问题和其他可能阻止 .htaccess 生效的情况的故障排除技巧

最后,为了回答您的第三个问题,如果您需要调试您在重写规则中引用的特定变量,或者正在使用要独立于规则进行评估的表达式,您可以执行以下操作:

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

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]
Run Code Online (Sandbox Code Playgroud)

通过将其放入指令来独立测试表达式<If>。这使您可以确保您的表达式在您期望时正确编写或匹配:

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

.htaccess 调试愉快!