求助:如何用.htaccess的RewriteRule实现指定URL重写?
当然可行!咱们来一步步实现你的URL改写需求
首先,你的目标是把 http://localhost/profile/swatalk 这类URL简化成 http://localhost/swatalk,同时让请求依然正确指向 profile.php?name=swatalk,完全可以通过调整.htaccess的Rewrite规则实现,具体步骤如下:
1. 核心重写规则(实现新URL到脚本的映射)
替换你现有的规则,添加以下内容到根目录的.htaccess文件中:
# 排除真实存在的文件和目录,避免误匹配 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配用户名格式的URL,转发到profile.php RewriteRule ^([a-zA-Z0-9_-]+)$ profile.php?name=$1 [L]
- 正则
^([a-zA-Z0-9_-]+)$用来匹配符合常见用户名格式的字符串(字母、数字、下划线、短横线),避免误匹配到其他真实文件(比如index.php)或目录。 [L]标记表示这是最后一条规则,匹配后不再继续处理后续规则。
2. 旧URL重定向(SEO友好,避免重复内容)
为了让之前的旧URL(/profile/swatalk)自动跳转到新URL,同时对搜索引擎友好,添加一条永久重定向规则(放在上面的规则之前):
# 将旧的/profile/xxx URL永久重定向到/xxx RewriteRule ^profile/([a-zA-Z0-9_-]+)$ /$1 [R=301,L]
R=301表示永久重定向,搜索引擎会更新索引到新URL,用户访问旧链接也会自动跳转到新地址。
3. 完整的.htaccess示例
把这些规则组合起来,最终的.htaccess内容大概是这样:
RewriteEngine On # 旧URL重定向到新URL RewriteRule ^profile/([a-zA-Z0-9_-]+)$ /$1 [R=301,L] # 排除真实文件/目录,重写新URL到profile.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z0-9_-]+)$ profile.php?name=$1 [L]
注意事项
- 确保你的Apache服务器已经开启了
mod_rewrite模块。 .htaccess文件要放在网站的根目录下(和profile.php同级)。- 测试前记得清除浏览器缓存,因为301重定向会被浏览器缓存下来。
- 如果你的用户名包含其他特殊字符,可以调整正则表达式来匹配,比如允许点号的话,把正则改成
^([a-zA-Z0-9_-.]+)$。
内容的提问来源于stack exchange,提问作者Yusuf Bulgurcu Steven
相关产品推荐
相关产品推荐

