logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

解决 Drupal 8 中的简洁 URL 问题

04/10/2025, by Ivan

基础知识

在 Drupal 8 中,简洁 URL(Clean URLs)默认启用且无法禁用。不过,你的 Web 服务器上必须安装重写模块(mod_rewrite)。

请检查浏览器地址栏。你的网站 URL 不应包含 ?q=。

正确的“简洁 URL”示例:

http://www.example.com/node/83

无法正常工作的 URL 示例:

http://www.example.com/?q=node/83

针对不同系统(如 Apache、WAMP、XAMPP 和 IIS)有额外的简洁 URL 设置指南。

启用简洁 URL 的服务器配置

你可以阅读更多关于 Web 服务器的其他要求

在独立服务器(httpd.conf)上配置简洁 URL

在独立服务器上启用简洁 URL 包括以下步骤:

1. 启用 Apache 的 mod_rewrite 模块。你可以联系主机提供商或参考 Apache 官方文档 了解更多信息。至少要确保 mod_rewrite 已在 Apache 安装中启用。

要检查 Apache2 是否启用了 mod_rewrite,请在命令行输入以下命令查看已加载的模块列表:

apache2ctl -M

在某些系统中可使用以下命令:

apachectl -M

或:

httpd -M

2. 在输出中检查是否包含 rewrite_module。

如果未列出 rewrite_module,则需要将其编译或作为可加载模块启用。通常可以通过在 Apache 配置文件中添加以下行启用模块:

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

确保取消注释 AddModule mod_rewrite.c(如果存在)。你也可以直接执行以下命令启用模块:

a2enmod rewrite

不同系统与 Apache 版本可能略有不同,请参考官方文档。

别忘了 重启 Apache 以使更改生效。

3. 找到你的网站的 Apache 配置文件。它可能是 httpd.conf、vhost.conf、默认站点配置文件(如 default.conf)或 apache2.conf。通常位于 /etc/httpd/conf 或 /etc/apache2 目录中。可以使用以下命令查找:

find /etc -name httpd* 或 find /etc -name apache2*
如果你没有这些文件的写入权限,且简洁 URL 无法使用,请联系系统管理员或主机提供商。但你仍然可以查看这些配置文件以帮助排查问题。

4. 将 Drupal 的重写规则复制或直接包含到 Apache 配置文件中。可参考 Drupal 指令配置指南。以下是 Drupal 8 的典型规则:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

示例(适用于 Debian 8 + Apache2 + ISPConfig):

<Directory /var/www/clients/*/*/web/>
  RewriteEngine on
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</Directory>

确保查看与你的 Drupal 主版本对应的 .htaccess 文件(如 8.x)。

如果不希望在 Apache 配置文件中定义规则,可以直接使用 Drupal 自带的 .htaccess 文件。但必须在 Apache 配置文件中允许使用它:

AllowOverride All
AccessFileName .htaccess

详细了解 Apache .htaccess 工作原理 或查看 AllowOverride 指令示例

关于 MultiViews:Apache 提供“MultiViews”功能,可在不指定扩展名的情况下访问文件。但这可能与 Drupal 的简洁 URL 冲突。建议在启用 Drupal 的简洁 URL 时禁用 MultiViews。默认情况下,Apache 不启用该功能。

共享服务器(.htaccess)配置简洁 URL

Drupal 默认提供一个示例 .htaccess 文件,通常足以启用简洁 URL。注意不要遗漏该文件,因为它以点(.)开头。启用简洁 URL 前,请确认此文件存在于 Drupal 安装目录中。

在终端使用 ls -a 检查隐藏文件。

如果 .htaccess 文件存在但简洁 URL 仍无效,请参考以下排查建议。如仍无效,请联系主机服务商。

故障排除

检查 .htaccess 是否生效

Apache 需明确允许 .htaccess 文件生效。这由 AllowOverride All 指令控制。要验证是否生效,可以临时向 .htaccess 文件中添加无效语句,如果页面返回“500 服务器错误”,说明文件已被读取。测试后立即删除。

设置 RewriteBase

最常需修改的配置是 RewriteBase。它可在 .htaccess 或 httpd.conf 中设置。默认情况下被注释,且多数环境下无需修改。

如果简洁 URL 无法使用,可尝试如下配置。例如,当网站安装在 /var/www/mysite/ 子目录中时:

RewriteBase /mysite

某些配置下使用以下设置即可:

RewriteBase /

$base_url

在某些服务器(如 FastCGI)上,可能需要在 settings.php 中手动设置 $base_url 变量,否则可能引发问题。参见 PHP Bug #19656

多站点配置

当 Drupal 提供多个站点时,RewriteBase 仅在这些站点位于同一子目录下时有效。例如:

RewriteBase /

适用于以下站点:

http://www.example.com/
http://www.example2.com/
http://www.example3.com/

而:

RewriteBase /mysite

适用于:

http://www.example.com/mysite
http://www.example2.com/mysite
http://www.example3.com/mysite

如果站点位于不同子目录,则需为每个路径定义独立规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/mysite/
RewriteRule ^ /mysite/index.php [L]

index.php 文件路径

某些服务器环境需修改 .htaccess 中的 index.php 路径。找到如下行:

RewriteRule ^ index.php [L]

根据站点目录调整。例如网站根目录为 http://example.com/subdir/ 时,应使用 /subdir/index.php

使用 Path 模块创建可读 URL

启用简洁 URL 后,Drupal 将生成类似 http://www.example.com/node/83 的地址。若想改为类似 “news/june-1st-news” 的 URL,可启用 Path 模块。详情请参阅其使用说明