【发布时间】:2017-03-16 09:29:55
【问题描述】:
我正在处理的项目有一个相当长且复杂的 RewriteRules 列表,出于遗留原因分为 2 个 .htaccess 文件。我将应用程序放入 Docker 容器中,以便更轻松地加入新开发人员,但 Ubuntu/Apache 组合在 RewriteRules 上令人窒息,并给了我一个 HTTP 500。
Docker 镜像:php:5.6-Apache 阿帕奇版本:2.4
我将日志记录提升到 trace4,它似乎找到了正确的文件 - 这是 mod_rewrite 调试输出的最后一行
[Thu Mar 16 09:08:15.459987 2017] [rewrite:trace1] [pid 17] mod_rewrite.c(475): [client 192.168.99.1:63990] 192.168.99.1 - - [rs.dev/sid#7f51cf6fece0][rid#7f51cf61c8f8/initial/redir#3] [perdir /var/www/appname/public_html/production/] pass through /var/www/appname/public_html/production/login.php
文件“/var/www/appname/public_html/production/login.php”存在,是应该加载的文件。但是,响应是作为 500 发送的(并且页面不会加载)。我在这里使用 /login URL 作为示例,但它发生在所有 URL 上。
这适用于运行 macOS 的 Mac 的本地主机,它适用于 cPanel 服务器,我似乎无法让它在 Docker 提供给我的 Ubuntu 基础上运行。
有谁知道为什么 Apache 会使用 mod_rewrite 并似乎识别出正确的文件,但随后不使用该文件?
作为参考,请求is on pastebin的整个日志输出。
【问题讨论】:
-
我怀疑引发 http 状态 500 的实际错误与重写过程无关。您的 http 服务器错误日志文件对请求有何说明?
-
500 表示 login.php 存在问题,而不是 apache 重写。尝试直接向该资源发出 http 请求。检查 Apache 错误日志。共享 PHP 文件。
-
“通过”并不意味着它已经识别或发现任何东西,只是它把它放回一般处理。
-
我本来打算为@WilliamGreenly 发布一些关于 500 错误也可能来自其他地方的讽刺内容,但后来我想我会三重检查 PHP 不是问题,然后瞧瞧它是!感谢您为我指明了正确的方向,(我的日志昨晚没有发现 PHP 错误)。
-
@JohnB 通常,我只是参考 Apache 的文档。对于 mod_rewrite 及其工作原理,这是 mod_rewrite 本身和 httpd.apache.org/docs/current/rewrite。从链接列表中有examples、Introduction、Ruleset Processing。这当然需要时间,但一旦你掌握了,就不会太难了。
标签: apache .htaccess ubuntu mod-rewrite