在 Ubuntu 上为 Apache2 开启 URL 重写(Rewrite)功能,通常需要完成以下几个步骤:
mod_rewrite 模块Apache 默认可能没有开启重写模块,你需要使用 a2enmod 命令来启用它:
sudo a2enmod rewrite
如果提示已经启用,可以忽略。
.htaccess 覆盖(关键步骤)仅仅开启模块还不够。默认情况下,Apache 出于安全或性能考虑,不允许在网站目录下的 .htaccess 文件中使用重写规则。你需要修改配置,将 AllowOverride 设置为 All。
方法一:修改虚拟主机配置(推荐) 编辑你的站点配置文件(以默认的为例):
sudo nano /etc/apache2/sites-available/000-default.conf
在 <VirtualHost *:80> 标签内部,添加如下 <Directory> 配置(假设你的网站根目录是 /var/www/html):
<VirtualHost *:80>
# 原有配置...
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
方法二:修改主配置文件(如果你想让所有 /var/www 下的站点都允许重写)
编辑 /etc/apache2/apache2.conf:
sudo nano /etc/apache2/apache2.conf
找到 <Directory /var/www/> 这一段,把里面的 AllowOverride None 改为 AllowOverride All:
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
修改配置后,必须重启 Apache 才能使配置生效:
sudo systemctl restart apache2
你可以在网站根目录(例如 /var/www/html)创建一个 .htaccess 文件来测试:
sudo nano /var/www/html/.htaccess
输入以下内容(一个简单的测试规则:访问 domain.com/test 会重定向到 index.php):
RewriteEngine On
RewriteRule ^test$ index.php [L]
然后在浏览器访问 http://你的服务器IP/test,如果页面跳转或显示了 index.php 的内容,说明重写功能已经成功开启。
检查 rewrite 模块是否已加载:
apache2ctl -M | grep rewrite
如果输出 rewrite_module (shared),说明模块已加载。
如果修改配置后报错: 可以使用 sudo apache2ctl configtest 检查配置文件语法是否正确。
.htaccess 文件对 Apache 进程(通常是 www-data 用户)是可读的。