php - 对SEO URL的POST请求被禁止

标签 php apache mod-rewrite

我有一个基本的mvc系统,它向url发送post数据,比如
管理/产品/添加/
但这给了我一个错误
被禁止的
您没有访问权限
/管理/产品/添加/在此服务器上。
此外,在尝试
使用错误文档处理请求。
重写规则很简单

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

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

最佳答案

有两个错误:
您没有在此服务器上访问/admin/product/add/的权限。
此外,尝试使用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)。
所以…未应用此重写规则。有许多事情可以阻止这一规则的适用:
mod_rewrite not activated:模块是否存在并启用(RewriteEngine on)?
语法错误:mod rewrite语法很难读取,有时非常复杂。但在这里似乎很简单。
rewriterule结果文件可能不是apache的有效目标。如果documentroot中不存在index.php文件,或者apache用户不可读,那么apache将失败。警告:让apache用户可以读取文件意味着对该文件具有读取权限,同时对apache用户的所有父目录具有执行权限。这就是经典的解决方案解决问题的地方。
规则必须在有效的配置文件中。这个规则是在一个apache配置文件中的一个位置或目录部分中吗?或者在全局范围内——这可能会改变重写规则语法。还是在.htaccess文件中?如果是.htacces,那么apache是否读取.htacces文件并在其中允许mod rewrite指令(chmod)。难道没有其他.htaccess文件优先吗?
所以要解决这个问题:
如果您的apache版本大于2.2.16,那么可以用FallbackRessource /index.php替换rewriterule,以检查这不是mod rewrite问题造成的。
尝试直接请求chown,以便至少对此文件的直接请求起作用
尝试直接访问documentroot上的有效ressource(一个txt文件、一个图像、一些不应由重写处理但直接提供的内容)
检查您的任何虚拟路径是否可以映射真实的物理路径,apache并不是试图为物理路径提供服务(比如当您编写AllowOverride None时),而是真正地将路径推送到index.php
检查apache错误日志。
使用RewriteCond %{REQUEST_FILENAME}-dindex.php重写调试模式
收集事实、设置和测试,然后将其推到so或Servfault
所以问题很简单:php应用程序没有收到请求。但在这种状态下有很多方法可以结束。信息本身并不重要。找到错误的唯一方法是检查所有参数(或者有多年的错误修复经验,为灯错误开发一个认知前直觉器官——通常是胡子——像管理员一样)。我们帮助你的唯一方法就是在一大串配置细节中找到奇怪的事实,这就是为什么好的问题包含了很多信息,即使所有这些信息对你来说都是“经典”的。
编辑
要澄清问题,您应该编辑您的答案,使用chrome developpers工具或firebug等工具跟踪RewriteLog请求(将网络跟踪保持在记录模式以捕获多个帖子),或者尝试使用实时http头回复来重播帖子。你应该试着把有问题的帖子隔离出来,并给我们详细的信息。调试并不神奇。
现在我知道一个神奇的随机失败。这是空的get url错误。可能是(或不是)。如果有一个空的get url隐藏在某个地方(例如css中的RewriteLogLevelPOST,或headers中的空链接)。因为这些隐藏的post在http中被定义为“重放启动源页面的请求,有些浏览器甚至重放给你页面的post(如果他们找到了)。这可能会导致隐藏的柱子断裂。
也可能是邮件没有发送到正确的服务器。很难说。因此,请从你的评论中收集信息,添加更多的网络分析,并编辑现在确实包含的事实不足的问题。

关于php - 对SEO URL的POST请求被禁止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13808954/

相关文章:

linux - 如何在服务器上设置 Zend Framework 2

java - 从 Solr 获取数据到 JTable

apache如何动态使用 "Header set Set-Cookie expires=<date>"

linux - 重定向域但保留原始 url

php - 将 MySQL 列名映射到变量名

php - Laravel Eloquent 关系 AVG 有

php - php代码中的Mysql错误

php - Laravel 遍历查询结果,然后分页

javascript - angularjs http + script7002 : xmlhttprequest: network error 0x80070005, 访问被拒绝

apache - 通过 htaccess : incorrect redirection error 将 http 重定向到 https