如何用.htaccess实现干净URL?博客页面URL重写需求
嘿,我来帮你搞定这个干净URL的问题!要把http://www.webiste.com/blog.php?title=how-to-make-dynamic-menu改成http://www.webiste.com/title/how-to-make-dynamic-menu,核心是用URL重写规则,下面分两种主流服务器环境给你详细步骤:
Apache服务器方案
Apache最常用的是通过.htaccess文件来配置重写规则,步骤如下:
确认mod_rewrite模块已启用
首先要确保你的Apache服务器开启了mod_rewrite模块,大部分主机默认是开启的;如果没开,需要在httpd.conf里找到#LoadModule rewrite_module modules/mod_rewrite.so,去掉前面的#号,然后重启Apache。创建/编辑.htaccess文件
在网站根目录(和blog.php同目录)创建或编辑.htaccess文件,添加以下代码:RewriteEngine On # 把旧的带参数URL永久重定向到干净URL(搜索引擎友好) RewriteCond %{QUERY_STRING} ^title=([^&]+)$ RewriteRule ^blog\.php$ /title/%1? [R=301,L] # 把干净URL重写为实际的blog.php请求(仅服务器内部处理,用户看不到) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^title/([^/]+)$ blog.php?title=$1 [L]PHP参数获取
配置完重写后,你原来的PHP代码里$_GET['title']依然可以正常使用,不需要修改——重写规则已经把title/how-to-make-dynamic-menu里的内容传递给了blog.php的title参数。
Nginx服务器方案
如果你的服务器用的是Nginx,需要在站点配置文件里添加重写规则:
编辑Nginx站点配置
找到你的站点配置文件(一般在/etc/nginx/sites-available/目录下),在server块内添加以下代码:# 处理干净URL的内部重写 location /title/ { rewrite ^/title/([^/]+)$ /blog.php?title=$1 last; } # 旧URL永久重定向到干净URL location = /blog.php { if ($args ~* "^title=([^&]+)$") { set $title $1; return 301 /title/$title; } }重启Nginx生效
配置修改后,执行sudo systemctl restart nginx重启服务,规则就会生效。
额外注意事项
- 301重定向的必要性:上面的规则都加了301永久重定向,这能告诉搜索引擎旧URL已永久迁移到新URL,不会影响你的SEO权重。
- 权限与配置检查:Apache环境下要确保
.htaccess文件权限为644,且服务器允许.htaccess覆盖配置(在httpd.conf里设置AllowOverride All)。
内容的提问来源于stack exchange,提问作者amarjeet singh

