织梦apache伪静态配置代码

部分服务器仍使用 Apache(如虚拟主机、LAMP 一键包),织梦在 Apache 下做伪静态通过 .htaccess 配置 mod_rewrite 实现。本文给出可直接复制使用的完整规则与排错方法。

一、开启 mod_rewrite 模块

宝塔 Apache:软件商店 → Apache → 设置 → 模块,确认 mod_rewrite 已启用。命令行:

# 查看已加载模块
apachectl -M | grep rewrite

# 若未加载,编辑 httpd.conf 取消注释
LoadModule rewrite_module modules/mod_rewrite.so

同时确保站点目录 AllowOverride All,否则 .htaccess 不生效:

<Directory "/www/wwwroot/yourdomain.com">
    AllowOverride All
    Require all granted
</Directory>

二、.htaccess 完整规则

在站点根目录创建 .htaccess

RewriteEngine On
RewriteBase /

# 防止直接访问 PHP 重复
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# 首页
RewriteRule ^index\.html$ /index.php [L]

# 列表页:/news/ 或 /news/list_5_2.html
RewriteRule ^([a-z0-9_-]+)/?$ /plus/list.php?dirname=$1 [L]
RewriteRule ^([a-z0-9_-]+)/list_([0-9]+)_([0-9]+)\.html$ /plus/list.php?tid=$2&PageNo=$3 [L]

# 文章页:/news/123.html
RewriteRule ^([a-z0-9_-]+)/([0-9]+)\.html$ /plus/view.php?aid=$2 [L]

# TAG 页:/tags/abc.html
RewriteRule ^tags/([^/]+)\.html$ /plus/tag.php?/$1 [L]
RewriteRule ^tags/([^/]+)/([0-9]+)\.html$ /plus/tag.php?/$1/$2 [L]

# 搜索页:/search/关键词.html
RewriteRule ^search/(.+)\.html$ /plus/search.php?q=$1 [L]

# 默认 404
ErrorDocument 404 /404.html

三、规则详解

1. RewriteCond 跳过已存在文件

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

这条让真实存在的图片、CSS、JS 文件直接返回,不被重写到 PHP,避免静态资源也走动态解析。

2. 列表页 dirname 适配

Apache 版本用 dirname 传目录名,需要在织梦 /plus/list.php 开头加一段把目录名转成 typeid 的逻辑:

if(isset($dirname) && !is_numeric($dirname)){
    $row=$dsql->GetOne("SELECT id FROM dede_arctype WHERE typedir LIKE '%/$dirname'");
    if($row) $tid=$row['id'];
}

3. 中文 tag 兼容

Apache 默认会对中文 URL 编码,$1 拿到的是百分号编码字符串,需要在 tag.php 里 urldecode:

$tag=urldecode(isset($tag) ? $tag : '');

四、后台对应设置

后台 系统 - 系统基本参数 - 核心设置

核心设置里还要把 cfg_rewrite_dirname 设为 y,让织梦生成的列表页 URL 用目录名而不是 typeid。

五、验证与排错

  1. 访问 /news/123.html,应返回文章页;
  2. 若返回 404,检查 AllowOverride 是否为 All;
  3. 若返回 500,查看 /www/server/apache/logs/error_log,多为规则语法错误;
  4. 若静态图片 404,是 RewriteCond 跳过规则没生效,检查文件路径。
Apache 的 rewrite 规则大小写敏感,RewriteRule 不能写成 rewriterule,目录名正则建议加 NC 标志忽略大小写。

六、Apache 与 Nginx 规则差异

Apache (.htaccess)Nginx
语法RewriteRule + 正则rewrite + 正则
标志[L] [R=301] [NC]last redirect permanent
性能每请求读 .htaccess 较慢配置预编译更快

七、注意事项

Apache 伪静态规则相对直观,但性能不如 Nginx,若站点流量增长建议尽早迁移到 Nginx。在切换前后用百度搜索资源平台的“URL 提交”和“抓取诊断”验证新 URL 是否能被正常抓取,确保改造期间收录不出现大幅波动。