dede自定义表单提交404

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 DEDE建站 正文

下面我将为你详细分析原因,并提供从简单到复杂的多种解决方案,你可以按照顺序逐一尝试。

核心原因分析

DedeCMS为了实现URL伪静态(使网址看起来像.html),会开启URL重写功能,当你提交自定义表单时,提交的地址可能是一个类似 plus/diy.php?action=post&diyid=1 的动态链接。

如果网站的URL重写规则没有正确处理这个动态链接,服务器(Apache或Nginx)就会认为这个地址不存在,从而返回404 Not Found错误。


解决方案(按推荐顺序)

检查并开启自定义表单的“使用HTML”功能(最常见、最简单)

这是导致404错误的最主要原因

  1. 登录你的DedeCMS后台。
  2. 在左侧菜单栏找到 【核心】 -> 模型管理】,模型管理页面,点击顶部的 【自定义表单】 标签页。
  3. 找到你出问题的那个自定义表单,点击后面的 【管理】【修改】 按钮。
  4. 在表单设置页面,找到 “使用HTML” 这个选项,务必将其勾选上
  5. 保存修改。

为什么这个方法有效? 勾选“使用HTML”后,DedeCMS会为这个表单生成一个静态的HTML页面(/plus/diy.php?diyid=1),当用户访问这个页面时,服务器会直接返回HTML文件,而提交表单时,表单的 action 属性也会指向这个正确的动态处理文件,从而绕过了URL重写规则带来的冲突。

注意:即使你勾选了“使用HTML”,提交按钮的 action 属性仍然应该是 plus/diy.php,而不是那个HTML页面的地址,勾选此选项主要是为了提供一个可供访问的表单页面,并确保后台处理逻辑正确。


检查并修正表单代码中的 action 属性

我们手动调用表单或在模板中修改了表单代码,导致 action 路径错误。

  1. 打开你调用自定义表单的模板文件(通常是 .htm 文件)。

  2. 找到 <form> 标签,检查它的 action 属性。

  3. 正确的 action 属性应该是:

    <form action="/plus/diy.php" method="post" enctype="multipart/form-data">
    • 确保路径是 plus/diy.php,不要写成 plus/diy.php?action=post&diyid=1,因为 diyid 和其他字段是通过隐藏的 input 提交的。
    • 确保 methodpost
    • 确保 enctypemultipart/form-data,如果你的表单包含文件上传字段,这个是必须的;如果没有,加上也无妨。
  4. <form> 标签内部,必须包含一个隐藏的 input 字段来传递表单ID:

    <input type="hidden" name="diyid" value="1" />

    这里的 value="1" 要替换成你自定义表单的实际ID。

  5. 还需要一个隐藏字段用于跳转(可选,但推荐):

    <input type="hidden" name="goto" value="-1" />

    value="-1" 表示提交成功后返回上一页,你也可以设置成一个固定的跳转URL,value="/success.html"


检查并修正URL重写规则(针对伪静态用户)

如果你的网站开启了伪静态(例如使用.htaccess或Nginx的rewrite规则),那么规则文件可能没有正确处理 plus/diy.php 这个路径。

针对Apache服务器 (检查 .htaccess 文件)

你的网站根目录下有一个 .htaccess 文件,打开它,检查是否包含对 plus/diy.php 的排除规则。

一个标准的、包含了对DIY表单排除的 .htaccess 规则类似这样:

# 将 RewriteEngine 开启
RewriteEngine On
# 排除对特定目录和文件的伪静态处理
# 这是最关键的一行,它告诉Apache不要对 plus/diy.php 进行重写
RewriteCond %{REQUEST_URI} !^/plus/diy\.php
RewriteCond %{REQUEST_URI} !^/plus/.*\.php$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [QSA,PT,L]
# 如果上面的规则不生效,可以尝试更明确的规则
# RewriteRule ^(plus/.+)\.php$ $1.php [L]
# RewriteRule ^plus/diy\.php$ - [L]

请确保你的 .htaccess 文件中有类似 RewriteCond %{REQUEST_URI} !^/plus/diy\.php 这样的规则,用来排除对DIY表单处理脚本的URL重写。

针对Nginx服务器 (检查 nginx.conf 或站点配置文件)

在你的Nginx服务器配置文件中,找到你网站的 server 块,检查 rewrite 规则。

你需要确保在 rewrite 规则之前,有一个明确的 location 块来处理 plus/diy.php

server {
    # ... 其他配置 ...
    # 关键部分:明确处理 diy.php
    location = /plus/diy.php {
        # 如果PHP是运行在FastCGI模式下
        fastcgi_pass   127.0.0.1:9000; # 或者 unix:/tmp/php-cgi.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
    # 其他常规的伪静态规则
    location / {
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php?s=$1 last;
            break;
        }
    }
    # ... 其他配置 ...
}

这个 location = /plus/diy.php 块会精确匹配 /plus/diy.php 这个路径,并将其交给PHP-FPM处理,而不会进入下一条通用的 rewrite 规则中。


检查文件权限和文件是否存在

虽然比较少见,但也是可能的原因。

  1. 确认文件存在:通过FTP或文件管理器,进入网站的 /plus/ 目录,确认 diy.php 文件是否存在。
  2. 检查文件权限:确保 diy.php 文件以及 /plus/ 目录具有正确的执行和读取权限,文件权限设置为 644,目录权限设置为 755

总结与排查步骤

当你遇到自定义表单提交404错误时,请按照以下步骤进行排查:

  1. 第一步(必做):进入后台,找到对应的自定义表单,勾选“使用HTML” 并保存,这是90%情况下能解决问题的方法。
  2. 第二步:检查调用表单的模板文件,确保 <form> 标签的 action 属性是 plus/diy.php,并且包含了正确的隐藏字段 diyid
  3. 第三步:如果网站开启了伪静态,检查服务器配置文件(.htaccessnginx.conf),确保有排除 /plus/diy.php 的规则。
  4. 第四步:作为最后检查,确认 /plus/diy.php 文件存在且权限正确。

按照这个流程,你应该能顺利解决DedeCMS自定义表单提交404的问题,如果问题依然存在,请提供你的网站URL、表单调用代码片段以及服务器类型(Apache/Nginx),以便进一步分析。

-- 展开阅读全文 --
头像
如何在C语言中使用graphics.h绘图?
« 上一篇 01-14
织梦搜索页面为何必须同一窗口打开?
下一篇 » 01-15

相关文章

取消
微信二维码
支付宝二维码

目录[+]