如何用.htaccess移除PHP扩展名并保留GET参数?PHP MVC场景
解决URL重写:将
example.com/search.php?key=abc改为example.com/search?key=abc 嘿,我来帮你搞定这个URL美化的需求!结合你现有的PHP MVC架构,我们需要调整.htaccess的规则,分两步走:先把旧的带.php的URL做301重定向(SEO友好,避免重复内容),再让新的干净URL内部转发到对应的search.php文件,同时不影响你现有的MVC路由规则。
完整的.htaccess配置
把下面的代码替换你当前的.htaccess内容即可:
Options -Multiviews RewriteEngine On # 1. 重定向旧URL:example.com/search.php?key=abc → example.com/search?key=abc RewriteCond %{THE_REQUEST} ^GET\ /search\.php\?key=([^\s&]+) [NC] RewriteRule ^search\.php$ /search?key=%1 [L,R=301] # 2. 内部转发新URL:example.com/search?key=abc → search.php(保留查询参数) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^search$ search.php [L,QSA] # 3. 保留你原有的MVC通用路由规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [L]
各规则的作用说明
第一步的重定向规则:
RewriteCond %{THE_REQUEST}用来匹配真实的HTTP请求(比如GET /search.php?key=abc HTTP/1.1),确保只重定向用户实际访问的旧URL,不会干扰内部转发逻辑。R=301是永久重定向,告诉搜索引擎该URL已永久迁移,有助于维护SEO权重。
第二步的内部转发规则:
^search$精确匹配/search路径(不会匹配/search/xxx这类子路径,避免和你的MVC路由冲突)。QSA(Query String Append)参数会自动把原URL的查询参数(比如?key=abc)附加到目标URL后,不用手动处理参数传递。
第三步的原有MVC规则:
- 保持原有逻辑不变,处理所有非文件、非目录的请求,转发到
index.php进行MVC解析,完全不影响你后续的控制器与方法调用。
- 保持原有逻辑不变,处理所有非文件、非目录的请求,转发到
注意事项
- 确保你的服务器已开启
mod_rewrite模块(主流主机默认都已开启,若未开启可联系主机商或修改Apache配置启用)。 - 测试前建议清空浏览器缓存,因为301重定向会被浏览器缓存,可能导致旧规则残留。
内容的提问来源于stack exchange,提问作者Isa Mtd
相关产品推荐
相关产品推荐

