Php 禁止发布搜索引擎优化URL请求

Php 禁止发布搜索引擎优化URL请求,php,apache,mod-rewrite,Php,Apache,Mod Rewrite,我有一个基本的MVC系统,它将POST数据发送到URL,例如 管理员/产品/添加/ 但这给了我一个错误 禁止的 您没有访问的权限 /管理/产品/添加/在此服务器上 此外,在尝试查找时遇到404 Not Found错误 使用ErrorDocument来处理请求 规则很简单 RewriteRule ^(.*)/$ index.php?uri=$1 上次我在服务器上看到它时,将文件/目录权限更改为755似乎可以修复它,但这次不行。我从未真正理解错误的原因,因此希望有人能够提供更多信息?尝试以下方法:

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

管理员/产品/添加/

但这给了我一个错误

禁止的

您没有访问的权限 /管理/产品/添加/在此服务器上

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

规则很简单

RewriteRule ^(.*)/$ index.php?uri=$1
上次我在服务器上看到它时,将文件/目录权限更改为755似乎可以修复它,但这次不行。我从未真正理解错误的原因,因此希望有人能够提供更多信息?

尝试以下方法:

RewriteCond %{REQUEST_METHOD} =POST
RewriteRule ^(.*)/$ index.php?uri=$1
您有两个错误:

  • 您没有在此服务器上访问/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未激活:模块是否存在并已启用(
    rewrite ENGINE on
  • 语法错误:mod rewrite语法很难阅读,有时非常复杂。但这里似乎很简单
  • RewriteRule生成的文件可能不是apache的有效目标。如果DocumentRoot中不存在index.php文件,或者apache用户无法读取该文件,则apache将失败警告:让apache用户能够读取文件意味着对该文件拥有读取权限,同时对apache用户的所有父目录也拥有执行权限。这就是经典的
    chmod
    /
    chown
    解决方案解决问题的地方
  • 规则必须位于有效的配置文件中。此规则是否在apache配置文件中的位置或目录部分中?或者在全局范围内--这可能会改变重写规则语法--。还是在.htaccess文件中?如果是.htacces,apache是否读取.htacces文件,并且是否允许修改重写指令(
    AllowOverride None
    )。是否有其他.htaccess文件优先
  • 因此,要解决问题:

    • 如果您的apache版本大于2.2.16,您可以用替换RewriteRule,以检查这是否来自mod rewrite问题
    • 尝试直接请求
      index.php
      ,这样至少可以直接请求该文件
    • 尝试直接访问documentRoot上的有效ressource(一个txt文件、一个图像、一些不应由重写处理但直接提供的内容)
    • 检查您的任何虚拟路径是否可以映射Apache没有尝试为物理路径提供服务的真实物理路径(例如当您编写
      RewriteCond%{REQUEST_FILENAME}-d
      ),但确实将路径推到
      index.php
    • 检查apache错误日志
    • 调试使用
      重写日志
      重写日志级别
    • 收集事实、设置和测试,然后将其推送到SO或
    所以问题很简单:php应用程序没有收到请求。但在这种状态下,有很多方法可以结束。信息本身并不十分重要。找到错误的唯一方法是检查所有参数(或者有多年的bug修复经验,并为lamp bug(通常是胡须)开发一个认知前直觉器官,比如管理员)。我们唯一能帮助你的方法就是在一大堆配置细节中找到奇怪的事实,这就是为什么好的问题包含很多信息,即使这些信息对你来说只是“经典的”

    编辑

    为了澄清问题,您应该编辑您的答案,使用诸如Chrome Developers tools或firebug之类的工具跟踪
    帖子
    请求(保持网络跟踪处于记录模式以捕获多篇帖子),或者尝试使用实时HTTP回复头重播帖子。你应该试着找出有问题的帖子,并给我们提供详细信息。调试并不神奇

    现在我知道了一个神奇的随机后失败。这是一个空的获取url错误。可能是这样(也可能不是)。如果您有一个隐藏在某处的空GET url(
    url()
    ,例如,在css中,或者在标题中有一个空链接“重播启动源页面的请求,一些浏览器甚至会重播提供给您该页面的帖子(如果找到)。这可能会导致隐藏帖子被破坏。”

    也可能是帖子没有发送到正确的服务器。很难说。所以请从你的评论中收集信息,添加更多的网络分析,并编辑问题
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php?uri=$1 [L]
    
    RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^www\.(.*)$ http://%1/$1 [R=301,L]