在Apache服务器的cPanel中实现Next.js应用www转非www的301重定向
问题
我把Next.js应用用独立构建包部署到了cPanel,访问不带www的example.com一切正常,但访问www.example.com时GET请求完不成。当前的.htaccess文件内容如下:
RewriteEngine on # DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN PassengerAppRoot "/home/username/public_html/App.Next" PassengerBaseURI "/" PassengerNodejs "/home/username/nodevenv/public_html/App.Next/18/bin/node" PassengerAppType node PassengerStartupFile /home/username/public_html/App.Next/server.js PassengerAppLogFile "/home/username/logs/passenger.log" # DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END # DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION BEGIN <IfModule Litespeed> </IfModule> # DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION END RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-SSL} !on RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^ %{REQUEST_SCHEME}://%1%{REQUEST_URI} [R=301,L]
需要实现http://www.example.com通过301永久重定向到https://example.com,服务器用的是Apache 2.4.57。
解决方案
你当前的重定向规则只处理了非HTTPS的www域名,没覆盖HTTPS场景,而且规则顺序不对,Passenger配置可能会干扰重定向执行。调整后的.htaccess如下:
RewriteEngine on # 处理所有www域名(HTTP/HTTPS)跳转到https非www域名 RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L] # 处理非www域名的HTTP转HTTPS RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-SSL} !on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN PassengerAppRoot "/home/username/public_html/App.Next" PassengerBaseURI "/" PassengerNodejs "/home/username/nodevenv/public_html/App.Next/18/bin/node" PassengerAppType node PassengerStartupFile /home/username/public_html/App.Next/server.js PassengerAppLogFile "/home/username/logs/passenger.log" # DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END # DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION BEGIN <IfModule Litespeed> </IfModule> # DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION END
改动要点:
- 调整规则顺序:把重定向规则放在Passenger配置前面,让Apache先完成跳转,再把请求交给Next.js应用,避免应用拦截未处理完的请求。
- 覆盖所有www场景:单独一条规则处理所有www开头的域名,不管是HTTP还是HTTPS,直接跳转到https的非www域名,不用分开写两种情况。
- 补全HTTP转HTTPS:确保不带www的HTTP请求也能跳转到HTTPS,保证全站都是加密访问。
测试注意事项:
- 修改后一定要清空浏览器缓存再测试,301重定向会被浏览器缓存,旧缓存可能导致测试结果不准。
- 确认cPanel里已经给
www.example.com配置了有效的SSL证书,不然HTTPS访问会弹证书错误。 - 检查Apache的
mod_rewrite模块是否启用,cPanel环境一般默认是开着的,如果没开要在cPanel里启用。
内容的提问来源于stack exchange,提问作者Hooman Limouee
相关产品推荐
相关产品推荐

