【问题标题】:How to debug .htaccess RewriteRule not working如何调试 .htaccess RewriteRule 不起作用
【发布时间】:2023-04-03 11:18:01
【问题描述】:

我在.htaccess 文件中有一个RewriteRule,它什么也没做。我该如何解决这个问题?

  • 如何验证 .htaccess 文件是否被 Apache 读取和遵守?我可以写一个回显“它正在工作”的消息吗?如果我写了,该行会在哪里回显?
  • 如果.htaccess 文件没有被使用,如何让 Apache 使用它?
  • 如果.htaccess正在使用,但我的RewriteRule仍然没有效果,我还能做些什么来调试?

【问题讨论】:

  • 如果您想验证您的网络服务器是否正在读取 htaccess 文件,只需创建一个简单的测试规则即可。在本文中了解更多信息helponnet.com/2021/05/14/…

标签: apache .htaccess mod-rewrite


【解决方案1】:

在您的.htaccess 中输入一些垃圾值 例如foo bar, sakjnaskljdnas 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 发生了变化:

来自Upgrading to 2.4 from 2.2

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

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

你可以完成

RewriteLog "/path/to/rewrite.log"

现在就这样

LogLevel debug rewrite_module:debug

【讨论】:

  • 好的,所以问题是,我正在尝试向 .htaccess 文件添加一个重写器,但由于某种原因它没有使用它。
  • @macha 试试上面的方法。如果您收到内部服务器错误,则意味着 mod_rewrite(.htaccess) 已启用。您在共享主机上吗?
  • 不,我正在使用本地主机,您知道 .htaccess 文件何时加载吗?我虽然 apache 会先读这个
  • @macha .htaccess 文件永远不会加载。当您尝试访问该文件夹中存在的页面时,它们会被 apache 访问(如果存在)。
  • 好的,我的问题是,如果有人请求一个网页,apache 是直接转到服务器端脚本还是会在该文件夹中查找 .htaccess 文件然后继续??
【解决方案2】:

“输入一些垃圾值”答案对我没有用,尽管输入了垃圾,我的网站仍在继续加载。

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

deny from all

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

【讨论】:

  • 这是最简单的测试,如果您不介意在验证时几秒钟内没有任何工作。
  • 是的——我花了大约一秒钟的时间来验证我正在处理的网站没有使用 .htaccess 文件。
  • 谢谢,工作就像一个魅力 :) 节省了我一些调试时间!
【解决方案3】:

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

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

应该改为

AllowOverride All

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

【讨论】:

  • 谢谢。我在目录树 /var/www 的主 apache2.conf 文件中找到了相关部分
【解决方案4】:

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

DirectoryIndex test.html

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

【讨论】:

    【解决方案5】:

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

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

    关于第二个问题,如果未读取 .htaccess 文件,则服务器的主 Apache 配置可能将 AllowOverride 设置为 None。 Apache 的文档中有 troubleshooting tips 用于该情况以及其他可能阻止 .htaccess 生效的情况。

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

    输出您引用的variable 以确保它具有您期望的值:

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

    通过将expression 放入&lt;If&gt; 指令来独立测试它。这使您可以确保您的表达式正确编写或在您期望的时候匹配:

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

    .htaccess 调试愉快!

    【讨论】:

      【解决方案6】:

      如果你可以访问你可以使用的 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 正常工作。

      【讨论】:

        【解决方案7】:

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

        http://htaccess.mwl.be/

        【讨论】:

          【解决方案8】:

          检查apache进程读取和执行.htaccess的权限是否可行。查看 Apache 的 error_log 将帮助您对权限相关的错误进行排序。

          【讨论】:

            【解决方案9】:

            为什么不在你的 .htaccess 文件中放一些垃圾并尝试重新加载 apache。如果 apache 无法启动,您就知道它在工作。删除垃圾然后重新加载 apache,如果它加载了恭喜您正确配置了 .htaccess。

            【讨论】:

            • 如果 .htaccess 错误,我认为 Apache 不会无法启动或运行,因为它在有页面请求之前不会检查 .htaccess。
            猜你喜欢
            • 2012-12-10
            • 1970-01-01
            • 2012-12-30
            • 1970-01-01
            • 1970-01-01
            • 2013-06-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多