为什么我在向 PHP 脚本发送 POST 请求时收到 403 错误?

为什么我在向 PHP 脚本发送 POST 请求时收到 403 错误?

背景

  • 我想允许我的用户提交崩溃报告并将其通过电子邮件发送给我。

  • 我在用着英国车祸报道使用我修改过的捆绑 PHP 脚本。此代码将崩溃报告连同 POST 一起发送到指定的 URL。

  • 我在运行 Linux 的共享服务器上。我的主要域名是 synapticmishap.co.uk。

问题

  • 当我发送崩溃报告时,在 Cocoa 端,它报告已成功发送,但我没有收到电子邮件。

  • 该代码已在许多其他成熟的 Cocoa 项目中使用,几个月前它就已经开始为我工作了。

  • 这使我得出结论,这些问题与我的网络服务器设置有关,而我对此几乎一无所知。

  • 当我查看日志文件时,我看到如下条目:

    IP 已删除- - [10/Jun/2010:09:47:53 +0100] “POST /crashreportform.php HTTP/1.1” 403 74 “-” “UKCrashReporter”

我尝试过的方法

  1. 我尝试访问以下页面:http://synapticmishap.co.uk/crashreportform.php通过浏览器。加载正常。

  2. 我已确保设置了此 php 脚本的权限,以便任何人都可以执行它。

  3. 我尝试从以 root 开始的各个级别的 .htaccess 部分中删除拒绝条目。

  4. 我下载了 Firefox 的 URLParams 插件,它允许您模拟 POST。我输入了上面的 URL,并尝试以“crashlog”作为参数并以“test”作为值进行发布。这在我的日志文件中生成了 200 个日志条目 - 它似乎有效,尽管没有发送任何邮件消息。

代码

我有以下http://synapticmishap.co.uk/crashreportform.php。为了让它正常工作,我已将其简化为基本框架。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <title>Crash Report</title>
</head>
<body>

<p>This page contains super special magic which submits a crash report item to me.</p>
<p>Nothing to see here - move along.</p>

<?php
mail( "[email protected]", "Crash Report", "\r\n\r\nThis is a test.");
?>
</body>
</html>

这是我的顶层 .htaccess 文件:

RewriteEngine on
# -FrontPage-
IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*
<Limit GET POST>
order deny,allow
deny from all
allow from all
</Limit>
<Limit PUT DELETE>
order deny,allow
deny from all
</Limit>
Options All -Indexes

RewriteCond %{HTTP_HOST} ^synapticmishap.co.uk$ [OR]
RewriteCond %{HTTP_HOST} ^www.synapticmishap.co.uk$

RewriteCond %{HTTP_HOST} ^lapsusapp.co.uk$ [OR]
RewriteCond %{HTTP_HOST} ^www.lapsusapp.co.uk$
RewriteRule ^/?$ "http\:\/\/synapticmishap\.co\.uk\/synapticmishap\/lapsuspromo\/" [R=301,L]

RewriteCond %{HTTP_HOST} ^jgtutoring.co.uk$ [OR]
RewriteCond %{HTTP_HOST} ^www.jgtutoring.co.uk$
RewriteRule ^/?$ "http\:\/\/synapticmishap\.co\.uk\/tutoring" [R=301,L]

RewriteCond %{HTTP_HOST} ^synapticmishap.co.uk$ [OR]
RewriteCond %{HTTP_HOST} ^www.synapticmishap.co.uk$
RewriteRule ^/?$ "http\:\/\/synapticmishap\.co\.uk\/synapticmishap" [R=301,L]

RewriteCond %{HTTP_HOST} ^jgediting.co.uk$ [OR]
RewriteCond %{HTTP_HOST} ^www.jgediting.co.uk$
RewriteRule ^/?$ "http\:\/\/synapticmishap\.co\.uk\/editing" [R=301,L]

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://synapticmishap.co.uk/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://synapticmishap.co.uk$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.synapticmishap.co.uk/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.synapticmishap.co.uk$      [NC]
RewriteCond %{HTTP_REFERER} !^http://synapticmishap.co.uk/synapticmishap/crashreportform.php/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://synapticmishap.co.uk/synapticmishap/crashreportform.php$      [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|bmp)$ - [F,NC]

error_log 文件似乎根本没有与此相关的任何错误。最后几条条目是:

[24-May-2010 03:20:21] WordPress database error MySQL server has gone away for query SELECT FOUND_ROWS() made by require, wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts
[08-Jun-2010 15:50:04] WordPress database error Duplicate entry '257-1' for key 1 for query INSERT INTO `wp_term_relationships` (`object_id`,`term_taxonomy_id`) VALUES ('257','1') made by wp_xmlrpc_server->wp_xmlrpc_server, IXR_Server->IXR_Server, IXR_Server->serve, IXR_Server->call, wp_xmlrpc_server->mw_editPost, wp_update_post, wp_insert_post, wp_set_post_categories, wp_set_object_terms

帮助!

我对此束手无策,而且我对所有这些网络内容都很陌生。如果有人能告诉我为什么这个方法行不通,我将不胜感激。谢谢。

更新 1

我今天早上发送的几封测试邮件现在已经发送成功了——4 小时后。考虑到电子邮件服务器与我发送的邮件服务器在同一个盒子上,这听起来不对劲。此外,错误仍在记录中。我刚刚发送了几封附有崩溃日志的测试电子邮件。我会看看这些邮件是否会在当天晚些时候出现,然后再发回来。

更新2

包含崩溃日志的电子邮件从未到达。我已经到了我能尝试的极限,没有时间再花无数天来解决它,而我根本没有时间。我绝望地向我的网络托管提供商提交了支持单,以得到某种修复。这是我现在唯一能想到的——他们正在阻止某些类型的 POST。由于我删除了文件中的所有 PHP 代码,但它仍然会产生错误,我认为这是我的 POST 格式或标头的问题,服务器不喜欢,而不是脚本中的 PHP。欢迎任何其他想法。

答案1

您的崩溃转储有多大?PHP 有内存限制,可能需要调整才能让您的脚本正常工作。内存限制必须足够大,才能执行脚本 + 任何上传的数据。

答案2

在与我的托管服务提供商多次电子邮件往来之后,发现这里出现了很多问题。

  1. 他们那边的各种安全设置不正确
  2. 我不知道必须将文件的权限设置为 644,否则它们将无法执行

另外,我确信还有很多其他内容他们没有详细说明。

总结?问题确实出在托管端,而这是我无能为力或不知道的事情。

相关内容