
在将php应用程序迁移至aws ec2时,若遇到“the form submitted did not originate from the expected site”错误,这通常是由于应用程序的csrf保护机制或安全cookie设置在http环境下被触发。本文将详细阐述此错误的原因,并提供将应用环境从http升级至https的解决方案,包括在ec2上配置ssl/tls证书及相关设置,以确保表单提交的安全性和应用的正常运行。
当PHP应用程序(特别是基于Zend等现代框架构建的应用)在AWS EC2上运行时,如果出现“The form submitted did not originate from the expected site”错误,这通常表明应用程序内置的安全机制被触发。此错误的核心原因通常与以下两点相关:
在AWS EC2环境下,尤其是在从本地开发环境迁移到云端时,很容易忽略HTTP到HTTPS的协议切换,从而引发此类安全错误。
解决此问题的最直接且推荐的方法是为您的应用程序启用HTTPS。HTTPS通过SSL/TLS协议加密客户端与服务器之间的通信,确保数据传输的机密性和完整性,同时满足应用程序对安全Cookie和CSRF保护的严格要求。
在AWS EC2上启用HTTPS主要有两种策略:通过负载均衡器(推荐)或直接在EC2实例上配置。
立即学习“PHP免费学习笔记(深入)”;
这是生产环境中实现HTTPS的最佳实践。ALB/NLB可以处理SSL/TLS终止,将加密流量解密后以HTTP协议转发到后端EC2实例,从而减轻EC2实例的计算负担。
步骤概述:
ALB监听器重定向示例(伪代码):
# HTTP:80 监听器规则
IF Host is any AND Path is any
THEN Redirect to HTTPS://#{host}:443/#{path}?#{query} with HTTP_CODE 301如果您没有使用负载均衡器,也可以直接在EC2实例上配置Web服务器(如Apache HTTP Server或Nginx)来处理SSL/TLS。
步骤概述(以Apache HTTP Server为例):
获取SSL/TLS证书:
sudo yum install -y epel-release # RHEL/CentOS sudo dnf install -y epel-release # Fedora sudo apt-get install -y certbot python3-certbot-apache # Debian/Ubuntu sudo certbot --apache -d your_domain.com -d www.your_domain.com
Certbot会自动修改Apache配置并设置证书自动续期。
配置Apache HTTP Server:
确保已安装mod_ssl模块:
sudo yum install -y mod_ssl # RHEL/CentOS sudo a2enmod ssl # Debian/Ubuntu
编辑Apache的SSL配置文件,通常位于/etc/httpd/conf.d/ssl.conf (RHEL/CentOS) 或 /etc/apache2/sites-available/default-ssl.conf (Debian/Ubuntu)。
在VirtualHost *:443块中配置证书路径:
<VirtualHost *:443>
ServerName your_domain.com
DocumentRoot /var/www/html/your_app_root
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/your_domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your_domain.com/privkey.pem
# SSLCertificateChainFile /path/to/intermediate_certificate.crt # 如果有中间证书
# 强制所有HTTP请求重定向到HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
ErrorLog /var/log/httpd/your_app_ssl_error.log
CustomLog /var/log/httpd/your_app_ssl_access.log combined
</VirtualHost>
# 可选:配置HTTP到HTTPS的重定向
<VirtualHost *:80>
ServerName your_domain.com
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>重启Apache:
sudo systemctl restart httpd # RHEL/CentOS sudo systemctl restart apache2 # Debian/Ubuntu
配置安全组:确保EC2实例的安全组允许来自TCP:443端口的入站流量。
即使配置了Web服务器或负载均衡器,有时PHP应用程序内部也可能需要一些调整来正确识别HTTPS连接。
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// 请求是HTTPS
} elseif (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
// 请求是HTTPS
} else {
// 请求是HTTP
}许多框架会自动处理这些代理头,但如果遇到问题,值得检查。
将PHP应用程序迁移到AWS EC2并解决“表单提交来源非预期站点”错误,核心在于确保应用程序在安全的HTTPS环境中运行。无论是通过AWS负载均衡器还是直接在EC2实例上配置SSL/TLS,启用HTTPS不仅能解决此特定错误,还能显著提升应用程序的整体安全性。
关键点回顾:
通过遵循上述步骤,您的PHP应用程序将能在AWS EC2上安全稳定地运行,避免因协议不匹配导致的安全问题。
以上就是解决EC2上PHP应用“表单提交来源非预期站点”错误:HTTPS配置指南的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号