如何移除URL中的index.php及name参数,生成友好URL
URL重写优化方案:移除index.php?name=并支持含特殊字符的参数
需求回顾
需要将 domain.com/folder/index.php?name=xxx 格式的URL(其中xxx可包含.、-、_)优化为 domain.com/folder/xxx,同时解决之前尝试的三段.htaccess代码无效的问题。
现有代码问题分析
第一段代码
- 第一条规则会触发无限循环重定向,因为它将所有请求重定向到当前URL,没有终止条件。
- 第二条规则的正则开头
^/folder/(.*)在.htaccess中无需前置/,因为.htaccess路径是相对当前目录的,导致规则无法匹配。
第二段代码
- 这段代码的作用是给URL自动补全
.php后缀,和移除index.php?name=的需求完全无关,无法实现目标效果。
- 这段代码的作用是给URL自动补全
第三段代码
- 正则表达式
[a-z0-9]+仅匹配小写字母和数字,未包含.、-、_,因此无法处理带这些符号的参数;同时规则结构匹配的是xxx/yyy格式路径,和需求的folder/xxx不匹配。
- 正则表达式
正确的.htaccess配置
将以下代码放在网站根目录的.htaccess文件中:
Options +FollowSymLinks -MultiViews RewriteEngine On # 可选:将旧URL永久重定向到新URL(利于SEO) RewriteCond %{THE_REQUEST} ^GET\ /folder/index\.php\?name=([^\s&]+) RewriteRule ^ /folder/%1? [R=301,L] # 内部重写:将新URL映射到实际处理的PHP文件 RewriteRule ^folder/([\w.-]+)$ /folder/index.php?name=$1 [L]
代码说明
Options +FollowSymLinks -MultiViews:启用符号链接跟随,关闭MultiViews功能避免与重写规则冲突。- 外部重定向规则:匹配用户直接访问的旧URL格式,将其永久跳转到新URL,
R=301表示永久重定向,末尾的?用于清除原URL的查询字符串。 - 内部重写规则:正则
[\w.-]+匹配字母、数字、下划线(\w包含这些)、.和-,完全覆盖需求中的参数字符;将folder/xxx的请求内部映射到folder/index.php?name=xxx,L表示执行完这条规则后停止后续规则处理。
简化版(若.htaccess放在folder目录下)
如果将.htaccess直接放在domain.com/folder/目录中,代码可简化为:
Options +FollowSymLinks -MultiViews RewriteEngine On # 可选:旧URL重定向 RewriteCond %{THE_REQUEST} ^GET\ /folder/index\.php\?name=([^\s&]+) RewriteRule ^ /folder/%1? [R=301,L] # 内部重写 RewriteRule ^([\w.-]+)$ index.php?name=$1 [L]
内容的提问来源于stack exchange,提问作者user20627660
相关产品推荐
相关产品推荐

