.htaccess配置需求:移除PHP扩展名规则与指定页面301重定向
嘿,我来帮你搞定这两个.htaccess的需求!先理清楚核心:一是全站通用移除.php扩展名的规则,二是把原来根目录的旧PHP页面301永久重定向到子文件夹的新路径,确保谷歌索引更新对吧?下面给你一步步拆解配置:
首先,所有规则都要先开启Apache的重写引擎,在.htaccess最顶部加上:
RewriteEngine On
第一步:旧页面到新子文件夹的301重定向
这部分要放在最前面,避免被后续规则干扰。针对你提到的页面,我们写精确匹配的规则,不会影响其他页面:
# 把旧的/about-us.php和/about-us(不管带不带.php)都重定向到新路径/company/about-us RewriteRule ^about-us(\.php)?$ /company/about-us [R=301,L] # 把旧的/customer-service.php和/customer-service重定向到新路径/customer-service/contact-customer-service RewriteRule ^customer-service(\.php)?$ /customer-service/contact-customer-service [R=301,L]
简单解释下:^about-us(\.php)?$ 意思是匹配以about-us开头,后面可选带.php的URL;[R=301]表示永久重定向,告诉搜索引擎更新索引;[L]表示匹配到这条规则就停止往下执行,避免冲突。如果还有其他旧页面要迁移,照着这个格式加就行,比如RewriteRule ^faq(\.php)?$ /support/faq [R=301,L]。
第二步:移除PHP扩展名的301重定向
这一步是为了统一URL格式——如果用户直接访问带.php的新页面(比如/company/about-us.php),自动重定向到不带.php的版本,利于SEO:
# 将所有带.php的URL重定向到不带.php的版本 RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] RewriteRule ^ %1 [R=301,L]
这里用%{THE_REQUEST}是为了获取用户实际发送的请求(比如GET /company/about-us.php HTTP/1.1),确保只处理真实的外部请求,避免内部重写循环。
第三步:内部重写(不带.php访问对应PHP文件)
最后一步是让服务器在用户访问不带.php的URL时,内部自动找到对应的.php文件处理,用户看不到这个过程:
# 当访问的不是目录,且对应的.php文件存在时,内部重写URL RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L]
解释下两个条件:!-d表示请求的不是真实存在的目录;%{REQUEST_FILENAME}.php -f表示对应的.php文件确实存在,这样就不会出现404错误。
注意事项
- 确保你的Apache服务器已经启用了
mod_rewrite模块(大多数主机默认是开启的,如果不确定可以问主机商) - 测试的时候可以先把
R=301改成R=302(临时重定向),确认所有跳转都正常后再改回301,避免误操作影响搜索引擎索引 - 所有规则都要放在根目录的
.htaccess文件里,子文件夹的.htaccess不需要额外配置
备注:内容来源于stack exchange,提问作者Bernard K.

