已启用rewrite_module但Drupal干净URL仍无法正常工作的问题求助
看起来你已经把基础环境搭得差不多了,mod_rewrite也确认加载成功,那问题大概率出在Apache的目录Rewrite规则配置上——毕竟你不想用.htaccess,就得直接在httpd.conf里写规则。我给你一步步梳理下要做的配置:
1. 修正httpd.conf中的目录配置块
打开/etc/httpd/conf/httpd.conf,找到对应你新DocumentRoot的<Directory>段(原来的可能指向/var/www/html,现在要改成/var/www/drupal),把内容替换成这样:
<Directory "/var/www/drupal"> Options Indexes FollowSymLinks AllowOverride None # 因为不用.htaccess,这里设为None Require all granted # 启用Rewrite引擎并添加Drupal干净URL核心规则 RewriteEngine On RewriteBase / # 规则逻辑:如果请求的不是真实文件或目录,就转发给index.php处理 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] </Directory>
这个规则是Drupal干净URL的核心,能把所有非静态资源的请求都交给Drupal的路由系统处理。
2. 再核对Rewrite模块加载状态
虽然你已经用httpd -M确认了rewrite模块存在,但可以顺便检查下httpd.conf里有没有这条配置(确保没被注释):
LoadModule rewrite_module modules/mod_rewrite.so
如果前面有#,去掉注释就行。
3. 处理SELinux的潜在限制
CentOS7默认SELinux是强制模式,这是很多人容易忽略的坑,它可能会干扰Apache的Rewrite功能或者文件访问权限:
- 先临时关闭测试:执行
setenforce 0,然后重启Apache服务systemctl restart httpd,试试跳转是否正常。 - 如果问题解决了,要么把SELinux设为宽容模式(编辑
/etc/selinux/config,把SELINUX=enforcing改成SELINUX=permissive,重启系统生效),要么给Drupal目录设置正确的SELinux上下文:chcon -R -t httpd_sys_content_t /var/www/drupal/ chcon -R -t httpd_sys_rw_content_t /var/www/drupal/sites/default/files/ # 给文件存储目录开放写入权限
4. 确认Drupal后台的干净URL设置
配置完Apache后,访问Drupal的后台配置页面/admin/config/search/clean-urls,确认干净URL选项已经启用。如果Apache配置正确,Drupal应该会自动检测到并允许开启该选项。
5. 查看Apache错误日志排查细节
如果还是有问题,去看Apache的错误日志/var/log/httpd/error_log,里面会有具体的错误信息——比如Rewrite规则的语法错误、权限不足提示等,能帮你精准定位剩余问题。
另外,也可以检查下Drupal的sites/default/settings.php,确保$base_url设置正确(比如$base_url = 'http://你的VM的IP地址';),避免跳转时出现路径错位的问题。
内容的提问来源于stack exchange,提问作者PietiePoo

