如何在.htaccess中移除PHP扩展名并实现URL路径转查询参数
解决方案
在现有.htaccess配置中添加以下两条规则,即可实现需求:
新增规则说明
1. 外部重定向(将带参数的旧URL转为友好URL)
这条规则负责把 https://mywebsite.it/room?id=1 这类URL外部重定向到 https://mywebsite.it/room/1,避免用户访问旧格式URL:
# 外部重定向:将 room?id=1 转为 room/1 RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{QUERY_STRING} ^id=(\d+)$ [NC] RewriteRule ^room/?$ /room/%1 [R=302,L,NE]
%{REQUEST_METHOD} !POST:排除POST请求,防止表单提交时触发重定向^id=(\d+)$:匹配仅包含id=数字的查询字符串R=302:临时重定向,上线稳定后可改为R=301永久重定向(注意301会被浏览器缓存)NE:避免URL中特殊字符被不必要编码
2. 内部重写(将友好URL映射回原逻辑)
这条规则负责把 https://mywebsite.it/room/1 内部映射到 room?id=1,让PHP代码能通过$_GET['id']获取参数:
# 内部重写:将 room/1 转为 room?id=1 RewriteRule ^room/(\d+)/?$ /room?id=$1 [L]
^room/(\d+)/?$:匹配room/数字或room/数字/(末尾斜杠可选)L:执行完这条规则后停止后续规则,避免冲突
完整.htaccess配置
将新增规则按顺序插入原配置中,最终完整代码如下:
Options +FollowSymLinks -MultiViews # Turn mod_rewrite on RewriteEngine On RewriteBase / # 外部重定向:将 room?id=1 转为 room/1 RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{QUERY_STRING} ^id=(\d+)$ [NC] RewriteRule ^room/?$ /room/%1 [R=302,L,NE] # To externally redirect /dir/foo.php to /dir/foo RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] RewriteRule ^ %1 [R=302,L,NE] # 内部重写:将 room/1 转为 room?id=1 RewriteRule ^room/(\d+)/?$ /room?id=$1 [L] ## To internally redirect /dir/foo to /dir/foo.php RewriteCond %{REQUEST_FILENAME}.php -f [NC] RewriteRule ^ %{REQUEST_URI}.php [L]
内容的提问来源于stack exchange,提问作者g-pane
相关产品推荐
相关产品推荐

