【问题标题】:POST request to SEO URL Forbidden对 SEO URL 的 POST 请求被禁止
【发布时间】:2013-11-12 01:40:38
【问题描述】:

我有一个基本的 MVC 系统,它将 POST 数据发送到诸如

之类的 URL

管理员/产品/添加/

但这给了我一个错误

禁止

您没有访问权限 /admin/product/add/ 在这台服务器上。

此外,在尝试访问时遇到 404 Not Found 错误 使用 ErrorDocument 来处理请求。

RewriteRule 很简单

RewriteRule ^(.*)/$ index.php?uri=$1

上次我在服务器上看到此问题,将文件/目录权限更改为 755 似乎可以解决此问题,但这次没有。我从来没有真正理解错误的原因,所以希望有人能够提供更多信息?

【问题讨论】:

  • 您是否通过表单传递了带有>< 字符的任何内容?或者,是否有任何名为“info”的表单字段?
  • 任何重写的网址都有效吗?即只是这种情况,还是所有网址?
  • 我正在使用CKEditor,我认为编码的html标签但可以检查。我将尝试一个仅发布基本文本字段的区域,以查看是否有链接。重写的网址有效,添加页面显示正常
  • 除了重写之外,文件系统上是否有真正的目录“admin”?
  • 我 99% 确定这也以某种方式与 CKEditor 相关联,我已经回到 TinyMCE,我会看看情况如何

标签: php apache mod-rewrite


【解决方案1】:

您有 2 个错误:

  1. 您无权访问此服务器上的 /admin/product/add/。
  2. 此外,在尝试使用 ErrorDocument 处理请求时遇到 404 Not Found 错误。

第二个肯定是同一个错误的结果。你的 apache 配置中可能有一些东西可以从默认的 http 服务器处理中删除 404 错误并将其推送到你的 php 应用程序,如果这个 php 应用程序正在工作,我们会有一个不错的 404,但是......

第一个告诉你你的 php 应用程序根本没有运行。

所以。第一个错误告诉我们 apache 确实尝试直接访问您服务器上的目录 /path/to/documentroot/admin/product/add/ 并生成它的列表(只有当 apache 被授权这样做时才会列出目录内容)。但是,这当然不是您服务器上的真实目录。它是您应用程序中的虚拟路径。所以 apache 以 404 结束(导致错误 2)。

应用程序处理一个虚拟路径,apache 不管理它。 RewriteRule 的工作是在 apache 尝试为其提供服务之前捕获请求的路径,并将其作为查询字符串参数提供给一个 php 文件 (index.php)。

所以...这个重写规则没有被应用。可能阻止应用此规则的因素有很多:

  1. mod_rewrite 未激活:模块是否存在并启用 (RewriteEngine on)?
  2. 语法错误:mod 重写语法很难阅读,有时非常复杂。但是这里看起来很简单。
  3. RewriteRule 结果文件可能不是 apache 的有效目标。如果 index.php 文件不在 DocumentRoot 中,或者 apache 用户无法读取,则 apache 将失败。 警告:拥有 apache 用户可读的文件意味着对 apache 用户拥有文件的读取权限以及对所有 父目录执行 权限.这就是您的经典 chmod/chown 解决方案正在解决问题的地方。
  4. 规则必须位于有效的配置文件中。此规则是否在位置或目录部分内的 apache 配置文件中?或者可能在全局范围内——这可能会改变重写规则语法——。还是在 .htaccess 文件中?如果它是 .htacces,apache 会读取 .htacces 文件,并且那里允许使用 mod-rewrite 指令(AllowOverride None)。没有其他 .htaccess 文件优先吗?

所以要解决这个问题:

  • 如果您的 apache 版本高于 2.2.16,您可以将 RewriteRule 替换为 FallbackRessource /index.php 以检查这不是来自 mod-rewrite 问题。
  • 尝试直接请求index.php,这样至少对该文件的直接请求有效
  • 尝试直接访问 documentRoot 上的有效资源(txt 文件、图像、不应由重写处理但直接提供的东西)
  • 检查您的任何虚拟路径是否可以映射真实的物理路径 Apache 并未尝试为物理路径提供服务(例如当您编写 RewriteCond %{REQUEST_FILENAME}-d 时),而是将路径真正推送到 index.php
  • 检查 apache 错误日志
  • 调试 mod_rewrite 使用RewriteLogRewriteLogLevel
  • 收集事实、设置和测试,然后将其推送到 SO 或 Servfault

所以问题很简单:php 应用程序没有收到请求。但是有很多方法可以结束这种状态。消息本身并不是很重要。找到错误的唯一方法是检查所有参数(或者拥有多年的错误修复经验并为灯错误开发预认知直觉器官 - 通常是胡须 - 就像管理员一样)。而我们帮助您的唯一方法是在一大堆配置细节中找到奇怪的事实,这就是为什么好的问题包含大量信息,即使所有这些信息对您来说看起来都只是“经典”。

编辑

要澄清问题,您应该编辑您的答案,使用 Chrome 开发者工具或 firebug 等工具跟踪 POST 请求(将网络跟踪保持在记录模式以捕获多个 POST)或尝试使用 Live HTTP 重播帖子标题回复。您应该尝试隔离有问题的 POST 并向我们提供详细信息。调试并不神奇。

现在我知道一个神奇的随机 POST 失败。这是空的 GET url 错误。可能是(或不是)。例如,如果您在某处隐藏了一个空的 GET url(<IMG SRC="">url() 在 css 中,或者在标头中有一个空的 LINK。因为这些隐藏的 POST 在 HTTP 中定义为“replay-the-request-which-launched-the -source-page,并且某些浏览器甚至会重放 POST,如果他们找到了会为您提供该页面的 POST。这可能会导致隐藏的 POST 被破坏。

也可能是 POST 未发送到正确的服务器。很难说。因此,请从您的 cmets 收集信息,添加更多网络分析并编辑现在确实包含的事实不足的问题。

【讨论】:

  • 感谢您的详细回复。为了澄清一些细节,URL 在没有 POST 数据的情况下可以正常工作,它会加载空白表单以输入所有数据,然后将其 POST 回自身 (action=""),即间歇性地发生错误!这是导致真正头痛的间歇性部分。 POST 数据确实包括 CKEditor 文本(我知道这与 HTML 视图不同,它会进行一些处理)和标准文本输入框中的 URL。恢复到 TinyMCE 已经让它消失了,但不知道为什么非常令人沮丧。
【解决方案2】:

试试这个:

RewriteCond %{REQUEST_METHOD} =POST
RewriteRule ^(.*)/$ index.php?uri=$1

【讨论】:

  • 我不是 htaccess 专家,但这不会将重写限制在发布数据存在的条件下吗?
【解决方案3】:

使用这个:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?uri=$1 [L]

也只能使用 www 或非 www 域,但不能同时使用两者。使用 htaccess 将用户重定向到您想要的位置...

非万维网到万维网:

RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

WWW 到 NonWWW:

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^www\.(.*)$ http://%1/$1 [R=301,L]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2018-08-18
    • 2017-02-06
    • 2019-10-11
    • 2019-02-22
    • 2019-01-26
    相关资源
    最近更新 更多