You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已启用rewrite_module但Drupal干净URL仍无法正常工作的问题求助

解决Drupal干净URL(无需.htaccess)的配置方案

看起来你已经把基础环境搭得差不多了,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:34:07