在 CentOS 上,如果你说的是 Apache(httpd),通常并不是 apache2(那是 Debian/Ubuntu 的叫法),而是 httpd。下面以 CentOS 7/8 + Apache(httpd) 为例,说明如何配置伪静态(URL Rewrite)。
httpd -M | grep rewrite
如果有 rewrite_module,说明已启用。
编辑配置文件:
vi /etc/httpd/conf/httpd.conf
确保这一行未被注释:
LoadModule rewrite_module modules/mod_rewrite.so
Apache 默认可能不允许使用 .htaccess。
找到你的站点配置(如 /etc/httpd/conf/httpd.conf 或 /etc/httpd/conf.d/*.conf):
<Directory "/var/www/html">
AllowOverride All
Require all granted
</Directory>
AllowOverride None→ 改成All
修改后重启 Apache:
systemctl restart httpd
在网站根目录创建 .htaccess:
RewriteEngine On
# 示例:将 /article/123 重写为 /article.php?id=123
RewriteRule ^article/([0-9]+)$ article.php?id=$1 [L]
比 .htaccess 性能更好。
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/html
<Directory "/var/www/html">
RewriteEngine On
RewriteRule ^article/([0-9]+)$ article.php?id=$1 [L]
</Directory>
</VirtualHost>
然后:
systemctl restart httpd
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
RewriteEngine On
RewriteRule ^([a-z]+)$ $1.php [L]
500 错误
AllowOverride All.htaccess 语法规则不生效
httpd -t
查看配置是否有误
SELinux 干扰
setsebool -P httpd_can_network_connect 1
如果你用的是 CentOS + Nginx、或 宝塔 / LNMP / 面板,可以告诉我,我可以给你对应配置。