解决 Drupal 8 中的简洁 URL 问题
基础知识
在 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 的服务器配置
在独立服务器(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 模块。详情请参阅其使用说明。