15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
21.10.2024
2 +1

如何修复WordPress中”您访问的链接已过期”错误

当文件上传或表单提交超过一个或多个PHP运行时限制时,WordPress中的“The link you followed has expired”错误就会被触发——具体涉及upload_max_filesizepost_max_sizemax_execution_timememory_limit。WordPress无法从这些服务器端拒绝中正常恢复,因此会显示这条通用消息,而非具体的PHP错误。

修复方法需要通过您的托管环境所提供的配置层来提高这些PHP指令的值:php.ini.htaccesswp-config.php,或控制面板界面。具体使用哪种方法完全取决于您的服务器访问级别——root SSH访问、托管cPanel或受限的共享环境各需要不同的方式。

此错误的实际原因

了解根本原因可以避免您采用错误的修复方法。当WordPress处理上传时,浏览器会向wp-admin/async-upload.phpwp-admin/update.php发送一个multipart POST请求。在WordPress执行任何一行应用代码之前,PHP会根据四个独立限制来评估该请求:

  • upload_max_filesize — 单个上传文件的硬性上限
  • post_max_size — 整个POST正文的上限,必须*大于*upload_max_filesize
  • max_execution_time — PHP进程可运行的最大实际秒数
  • memory_limit — PHP进程可用的RAM;图像处理和主题安装对内存需求较高

如果其中任何一项被突破,PHP会静默终止请求。WordPress收到空响应或格式错误的响应,并显示”The link you followed has expired”。该错误并非WordPress的bug——而是PHP在执行服务器策略。

实际中的常见触发场景:

  • 在默认上传限制为2 MB的共享主机上安装高级主题(通常为5–30 MB)
  • 上传WooCommerce产品CSV导入文件
  • 安装包含捆绑资源的插件包
  • 通过WordPress仪表盘从备份存档恢复站点
  • 运行触及执行时间上限的长时间导入脚本

PHP指令快速参考表

指令默认值(典型共享主机)建议最低值控制内容
`upload_max_filesize`2M64M–128M单个上传文件的最大大小
`post_max_size`8M128M(必须超过上传限制)整个POST请求正文的最大大小
`max_execution_time`30300PHP终止脚本前的秒数
`max_input_time`60300PHP解析输入数据所花费的秒数
`memory_limit`128M256M每个PHP进程的RAM

关键规则:post_max_size必须始终设置为高于upload_max_filesize。如果您设置了upload_max_filesize = 128M但保留了post_max_size = 8M,上传仍会失败,因为POST正文限制会首先被触及。

方法一:编辑php.ini(推荐用于VPS和独立服务器)

这是最可靠且永久的方法。在您拥有root或sudo访问权限的VPS托管独立服务器环境中,您可以直接控制PHP配置。

找到活动的php.ini文件:

php --ini | grep "Loaded Configuration File"

或在WordPress站点内创建一个临时文件:

<?php phpinfo(); ?>

在输出中查找Loaded Configuration File行,然后立即删除该文件。

编辑指令:

upload_max_filesize = 128M
post_max_size = 256M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M

保存后,重启PHP-FPM或Apache以应用更改:

# For PHP-FPM (most common on modern stacks)
sudo systemctl restart php8.2-fpm

# For Apache with mod_php
sudo systemctl restart apache2

# For Nginx + PHP-FPM
sudo systemctl restart nginx php8.2-fpm

验证新值是否生效:

php -r "echo ini_get('upload_max_filesize');"

需要了解的边缘情况:在运行多个PHP版本的服务器上(cPanel上的常见配置),每个版本都有独立的php.ini。编辑错误的版本不会产生任何效果。在编辑之前,请确认WordPress正在使用哪个PHP版本。

方法二:使用.htaccess(Apache共享主机)

如果您在没有直接php.ini访问权限的共享主机上,且服务器运行Apache并启用了mod_phpsuPHP,您可以使用.htaccess按目录覆盖PHP指令。

通过FTP、SFTP或您的托管文件管理器访问WordPress根目录。打开.htaccess并追加以下代码块:

<IfModule mod_php.c>
    php_value upload_max_filesize 128M
    php_value post_max_size 256M
    php_value max_execution_time 300
    php_value max_input_time 300
    php_value memory_limit 256M
</IfModule>

保存并上传文件,然后测试您的上传。

重要注意事项:

  • 此方法在运行PHP-FPM、CGI或FastCGI的服务器上不起作用。在这些技术栈上,php_value.htaccess中的指令会导致500内部服务器错误,因为处理PHP的Apache模块不是mod_php。如果保存后出现500错误,请立即删除这些行。
  • 在Nginx服务器上,.htaccess会被完全忽略。请改用php.iniphp.ini用户覆盖文件。
  • 某些托管服务商明确禁用了PHP指令的AllowOverride,即使在Apache上,此方法也会失效。

方法三:向wp-config.php添加指令

此方法使用PHP的ini_set()函数在运行时覆盖指令。它不受Web服务器类型的限制,但受主机的open_basedirdisable_functions限制约束——出于安全原因,某些主机会屏蔽ini_set()

打开WordPress根目录中的wp-config.php,并在/* That's all, stop editing! Happy publishing. */注释之前添加以下行:

@ini_set( 'upload_max_size',    '128M' );
@ini_set( 'post_max_size',      '256M' );
@ini_set( 'max_execution_time', '300'  );
@ini_set( 'max_input_time',     '300'  );
@ini_set( 'memory_limit',       '256M' );

@ini_set()被禁用时会抑制错误,防止出现白屏。但是,如果主机使用php_admin_value在服务器级别锁定了这些值,ini_set()调用会被静默忽略——值不会改变。

如何验证是否真正生效:

安装免费的Query Monitor插件并检查PHP环境选项卡,或添加临时的phpinfo()调用。如果值仍显示旧限制,则ini_set()正在被更高层级覆盖,您需要使用其他方法。

方法四:在cPanel中调整PHP设置

对于通过cPanel管理的托管环境——包括带cPanel的VPS——您可以通过图形界面修改PHP限制,无需修改任何文件。

步骤:

  1. 登录cPanel。
  2. 导航到软件并点击MultiPHP INI Editor
  3. 从下拉菜单中选择您WordPress站点的文档根目录。
  4. 找到并更新以下字段:
  • upload_max_filesize128M
  • post_max_size256M
  • max_execution_time300
  • memory_limit256M
  1. 点击应用

或者,如果您的主机使用CloudLinux,可使用Select PHP Version(PHP Selector)。在选项选项卡下,相同的指令以滑块或输入框的形式提供。

cPanel在后台实际执行的操作:它会在您的文档根目录中写入.user.ini文件(用于PHP-FPM)或修改.htaccess(用于mod_php)。如果您之后手动编辑这些文件,可能会覆盖cPanel的更改——请注意这一冲突。

方法五:创建或编辑.user.ini文件(PHP-FPM环境)

这是大多数教程遗漏的方法,但它是PHP-FPM的正确方式——PHP-FPM是几乎所有现代托管技术栈(包括基于Nginx的环境)上的默认PHP处理程序。

在您的WordPress根目录中创建一个名为.user.ini的文件,内容如下:

upload_max_filesize = 128M
post_max_size = 256M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M

将其上传到与wp-config.php相同的目录。PHP-FPM会定期扫描.user.ini文件——缓存TTL由user_ini.cache_ttl控制,默认为300秒(5分钟)。更改不会立即生效。如果需要立即生效,请重启PHP-FPM。

sudo systemctl restart php8.2-fpm

安全提示:.user.ini文件不应可通过Web访问。如果您使用Apache,请将以下内容添加到您的.htaccess中:

<Files ".user.ini">
    Require all denied
</Files>

在Nginx上,添加一个location块来拒绝访问:

location ~ /.user.ini {
    deny all;
}

方法六:联系您的托管服务商

如果上述所有方法都无法改变您通过phpinfo()或Query Monitor验证的PHP值,则主机正在PHP-FPM池级别或通过服务器配置中的php_admin_value指令强制执行限制——这两种情况都无法通过任何用户可访问的文件来覆盖。

在这种情况下,请联系支持并请求具体的提升。提供确切的指令名称和目标值。如果主机拒绝或设置的硬性上限不满足您的需求,请考虑迁移到VPS托管方案,在那里您可以完全控制PHP配置。

诊断实际触发错误的限制

在应用任何修复之前,请使用以下诊断步骤,而非凭猜测:

从命令行检查当前PHP限制:

php -r "echo 'upload_max_filesize: ' . ini_get('upload_max_filesize') . PHP_EOL;
echo 'post_max_size: ' . ini_get('post_max_size') . PHP_EOL;
echo 'max_execution_time: ' . ini_get('max_execution_time') . PHP_EOL;
echo 'memory_limit: ' . ini_get('memory_limit') . PHP_EOL;"

检查PHP错误日志以获取实际失败原因:

tail -n 50 /var/log/php/error.log
# or
tail -n 50 /var/log/apache2/error.log

查找包含Allowed memory sizeMaximum execution timePOST Content-Length的行。具体消息会告诉您确切需要针对哪个指令。

检查您正在上传的文件大小与当前upload_max_filesize的对比。如果文件为45 MB而限制为64 MB,则上传限制不是问题所在——请改为查看post_max_sizememory_limit

选择正确方法:决策矩阵

您的环境推荐方法
具有root SSH的VPS或独立服务器编辑系统`php.ini`,重启PHP-FPM
cPanel共享主机MultiPHP INI Editor或PHP Selector
Apache共享主机,无cPanel使用`php_value`的`.htaccess`(仅限mod_php)
Nginx + PHP-FPM,无root访问WordPress根目录中的`.user.ini`
任何环境,快速测试使用`ini_set()`的`wp-config.php`
所有方法均失败联系主机或迁移至VPS

认为问题已解决前的关键技术检查清单

  • post_max_size设置为高于upload_max_filesize——这是最常见的配置错误
  • 已通过phpinfo()php -r "echo ini_get(...)"验证更改——而非仅凭假设
  • 如果直接编辑了.user.iniphp.ini,已重启PHP-FPM
  • 正在编辑的.user.iniphp.ini与实际为WordPress站点提供服务的PHP版本匹配
  • 如果您正在安装大型主题或运行图像密集型操作,memory_limit至少为256M
  • 已检查错误日志以确认哪个具体限制导致了终止
  • 如果使用共享虚拟主机方案,已确认主机的硬性上限——某些服务商无论用户设置如何,都将upload_max_filesize限制在64M
  • 修复上传错误后,如果您通过HTTPS访问wp-admin,请验证您的SSL证书是否有效,因为混合内容或证书错误可能产生表面上类似的重定向失败

常见问题

为什么即使我在.htaccess中增加了upload_max_filesize,错误仍然出现?

服务器可能通过FastCGI或PHP-FPM而非mod_php运行PHP。.htaccess中的php_value指令仅由Apache的mod_php处理程序处理。在PHP-FPM技术栈上,请改用WordPress根目录中的.user.ini文件。

upload_max_filesizepost_max_size有什么区别,为什么两者都重要?

upload_max_filesize限制multipart上传中每个单独文件的大小。post_max_size限制整个POST请求正文的总大小,包括文件数据加上表单字段和边界。如果post_max_size小于upload_max_filesize,POST正文限制会首先被触及,PHP会在WordPress能够评估文件大小之前丢弃整个请求。

我在wp-config.php中的ini_set()调用被忽略了。为什么?

主机在PHP-FPM池配置或Apache虚拟主机块中使用了php_admin_valuephp_admin_value从应用程序的角度将指令设置为只读——针对这些指令的ini_set()调用会被静默丢弃。只有托管服务商才能更改以这种方式设置的值。

如何验证我的PHP配置更改确实生效了?

在您的WordPress根目录中创建一个包含<?php phpinfo(); ?>的临时文件,在浏览器中访问它,并搜索指令名称。Local Value列显示该目录的有效值。检查完毕后立即删除该文件——将phpinfo()输出公开访问是一个安全风险。

此错误是否可能由PHP上传限制以外的原因引起?

是的。WordPress nonce过期也会产生相同的消息。WordPress nonce默认有效期为24小时。如果用户打开插件上传页面,空闲超过24小时后再提交表单,nonce验证会失败,WordPress会显示”The link you followed has expired”。在这种情况下,只需刷新页面即可生成新的nonce,上传可正常进行——无需更改任何PHP配置。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用