如何在Drupal 8.5.0中启用Clean URLs及修复相关警告
刚巧我之前在Drupal 8.5.0上折腾过Clean URLs,给你一步步捋清楚怎么启用,还有那些常见警告的解决办法:
一、启用Clean URLs的完整步骤
- 第一步:确认服务器的rewrite配置(Apache环境)
这是最基础的前提,Clean URLs依赖Apache的mod_rewrite模块。- 如果是Ubuntu/Debian系统,直接执行命令启用模块:
sudo a2enmod rewrite,然后重启Apache:sudo systemctl restart apache2。 - 如果是CentOS/RHEL,需要编辑
httpd.conf文件,找到#LoadModule rewrite_module modules/mod_rewrite.so这一行,把前面的#删掉,然后重启httpd服务:sudo systemctl restart httpd。 - 还要确保站点的虚拟主机配置里,
AllowOverride设置为All,这样Drupal的.htaccess才能生效。比如:<Directory /var/www/html/your-drupal-site> AllowOverride All Require all granted </Directory>
- 如果是Ubuntu/Debian系统,直接执行命令启用模块:
- 第二步:配置Drupal的.htaccess文件
进入Drupal根目录,默认会有一个.htaccess.txt文件,把它重命名为.htaccess。如果已经存在.htaccess,检查里面的RewriteBase设置:- 如果你的Drupal安装在域名根目录(比如
http://example.com),就设置为RewriteBase /。 - 如果在子目录(比如
http://example.com/drupal),就改成RewriteBase /drupal/。
- 如果你的Drupal安装在域名根目录(比如
- 第三步:在Drupal后台启用Clean URLs
登录后台后,进入配置 > 搜索引擎优化 > 干净URL(路径是/admin/config/search/clean-urls),勾选“启用干净URL”选项,点击保存即可。如果看不到这个选项,说明前面的服务器配置有问题,先回头排查。
二、常见Clean URLs警告的解决方法
警告1:后台看不到Clean URLs启用选项,提示“无法验证Clean URLs”
- 先重复检查
mod_rewrite是否真的启用:可以创建一个phpinfo.php文件,内容为<?php phpinfo(); ?>,访问后搜索mod_rewrite,如果能找到说明模块已启用,否则重新执行启用步骤。 - 检查
.htaccess的权限:确保文件所有者是web服务器用户(比如www-data),权限设置为644。执行命令:sudo chown www-data:www-data .htaccess sudo chmod 644 .htaccess - 重启Apache/httpd服务,然后刷新Drupal后台页面,再尝试查看Clean URLs选项。
警告2:启用Clean URLs后访问页面出现404错误
- 检查
RewriteBase是否设置正确:很多时候404都是因为这个路径写错了,比如子目录的情况下没加子目录路径。 - 清除Drupal缓存:进入后台配置 > 性能(
/admin/config/development/performance),点击“清除所有缓存”;如果安装了Drush,直接执行drush cr更快捷。 - 测试服务器Rewrite规则:在Drupal根目录新建一个
test.html,然后在.htaccess里添加一行RewriteRule ^my-test$ test.html,访问http://your-site/my-test,如果能打开test.html,说明Rewrite规则生效,问题可能出在Drupal配置或缓存。
警告3:后台提示“Clean URLs已启用,但服务器配置可能存在问题”
- 检查
.htaccess里的核心Rewrite规则是否完整,默认的规则应该包含这段(没被注释):RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] - 检查服务器的
AllowOverride是否真的生效:如果虚拟主机配置里设的是AllowOverride None,.htaccess里的规则根本不会被执行,必须改成AllowOverride All。
如果还有其他特殊的警告信息,你可以把具体内容贴出来,再针对性排查~
内容的提问来源于stack exchange,提问作者Sani mori




