Drupal 7.36从HTTP迁移至HTTPS后CSS/JS失效问题求助
兄弟,我之前处理过好几个Drupal 7迁HTTPS的坑,你的情况一看就是几个常见配置没跟上,结合你说的本地正常、生产环境CSS/JS还指向HTTP,还有主题路径的差异,给你一步步捋:
1. 先把Drupal核心配置拉回正轨
首先得确保生产环境的sites/default/settings.php(你说HTTPS环境用的是这个目录)里的基础URL是硬指定的HTTPS地址,别让Drupal自动判断出错:
$base_url = 'https://example.com'; // 替换成你的实际域名
然后登录Drupal后台,依次去:
- 配置 → 系统 → 站点信息:把「站点URL」改成
https://example.com,别留HTTP的地址 - 配置 → 媒体 → 文件系统:检查公共文件路径,用相对路径(比如
sites/default/files),别写死http://example.com/sites/default/files
2. 主题资源路径的坑要填
你提到HTTP环境主题在sites/all/themes/MYTHEME,生产HTTPS环境是sites/default?这里大概率是主题里的CSS/JS引用写死了HTTP地址,或者用了绝对路径但没适配HTTPS。
- 打开主题的模板文件(比如
page.tpl.php),检查所有资源引用:别直接写<link href="http://example.com/sites/all/themes/MYTHEME/style.css">,换成Drupal自带的函数生成路径,比如:
用$theme_path = drupal_get_path('theme', 'MYTHEME'); print '<link rel="stylesheet" href="' . file_create_url($theme_path . '/style.css') . '">';file_create_url()会自动根据当前站点的协议(HTTP/HTTPS)生成正确的路径。 - 如果用了CSS/JS聚合功能,一定要去配置 → 性能里清空所有聚合缓存,甚至直接关掉聚合先测试,没问题再开。
3. 服务器端的配置补全
你给的mod_expires配置没问题,但要确保服务器的HTTPS相关模块和虚拟主机配置正确:
- 确认服务器启用了
mod_ssl和mod_rewrite模块(Apache环境下) - 虚拟主机的HTTPS配置要包含Drupal的重写规则,比如:
<VirtualHost *:443> ServerName example.com DocumentRoot /path/to/your/drupal/root SSLEngine On SSLCertificateFile /path/to/your/certificate.crt SSLCertificateKeyFile /path/to/your/private.key # 你的mod_expires配置可以放在这里 <IfModule mod_expires.c> ExpiresActive On ExpiresDefault A1209600 <FilesMatch \.php$> ExpiresActive Off </FilesMatch> </IfModule> # 确保Drupal的URL重写生效 <Directory /path/to/your/drupal/root> AllowOverride All RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] </Directory> </VirtualHost> - 还要在Drupal根目录的
.htaccess里加上HTTP转HTTPS的强制跳转,放在默认重写规则之前:RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
4. 数据库里的旧URL要清干净
Drupal的数据库里大概率藏了很多硬编码的HTTP地址(比如节点内容、区块、主题设置),得批量替换:
- 如果你用Drush的话,直接跑这几个命令(记得替换成你的域名):
# 替换变量表中的URL drush sqlq "UPDATE variable SET value = REPLACE(value, 'http://example.com', 'https://example.com');" # 替换节点内容里的URL drush sqlq "UPDATE node_revision SET body = REPLACE(body, 'http://example.com', 'https://example.com');" drush sqlq "UPDATE field_data_body SET body_value = REPLACE(body_value, 'http://example.com', 'https://example.com');" - 怕直接改数据库出错的话,也可以装个「Search and Replace」模块,可视化替换所有旧URL,更安全。
最后别忘了清空Drupal所有缓存!后台点「配置 → 性能 → 清空所有缓存」,或者用drush cache-clear all,Drupal 7的缓存真的很顽固,不清的话改了也白搭。
内容的提问来源于stack exchange,提问作者Ashish Kumar Saxena
相关产品推荐
相关产品推荐

