在 Ubuntu 下使用 Apache2 配置“伪静态”(通常是把动态 URL 重写成静态形式,比如 /article/123.html → /index.php?a=article&id=123),核心就是使用 mod_rewrite 模块和 .htaccess 或虚拟主机配置。
下面按最常见场景一步步说明。
sudo a2enmod rewrite
sudo systemctl restart apache2
确认模块已加载:
apache2ctl -M | grep rewrite
看到 rewrite_module 就说明成功。
Apache 默认可能不允许目录使用 .htaccess。
编辑站点配置(示例):
sudo nano /etc/apache2/sites-available/000-default.conf
在 <VirtualHost *:80> 里加上:
<Directory /var/www/html>
AllowOverride All
</Directory>
保存后重启:
sudo systemctl restart apache2
⚠️ 如果你用的是其他目录(如
/var/www/your_site),改成对应路径。
在网站根目录创建或编辑:
nano /var/www/html/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,L]
</IfModule>
RewriteEngine On
RewriteRule ^article/([0-9]+)\.html$ article.php?id=$1 [L]
访问:
/article/123.html
实际执行:
/article.php?id=123
不推荐滥用 .htaccess(性能略差),可直接写在配置里:
<VirtualHost *:80>
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [QSA,L]
</Directory>
</VirtualHost>
然后:
sudo systemctl restart apache2
rewrite 模块AllowOverride 不是 All查看日志:
sudo tail -f /var/log/apache2/error.log
加判断:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
| 框架 | 常见规则 |
|---|---|
| WordPress | 默认固定链接 |
| ThinkPHP | index.php/ 模式 |
| Laravel | public/index.php |
| 自写 PHP | 自定义 RewriteRule |
如果你能告诉我:
我可以直接给你可用的完整配置。