规则的工作方式如下:
RewriteRule <pattern_A> <target_B>
它总是从<pattern_A>
to 开始 工作<target_B>
,从不反过来,这个规则没有“链接”两个请求。此答案的顶部解决了“为另一个 URL 更改 URL”时发生的两种不同的事情。
您拥有的规则采用不带查询字符串的 URL,并在内部将其重写为带有查询字符串的 php 文件。浏览器没有看到这种情况发生,它在“幕后”。当您说您希望地址栏显示没有查询字符串的 URL 时,您首先会转到一些其他的 URL,并且“其他”URL 需要从外部重定向浏览器。因此,根据您已有的规则:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /profile\.php\?id=([^&\ ]+)
RewriteRule ^ /users/%1? [L,R=301]
它与请求字符串匹配,而不是请求 URI(它在 URL 处理管道和重写引擎中发生更改),提取 ID,并使用标志将浏览器重定向到不带查询字符串的新 URL 。R=301
您确实需要更改所有内容,以便它们使用看起来更清晰的 URL,而不是依赖一种非常繁琐且效率低下的方式来重定向浏览器,然后在内部重写回原始 URL。