如何使用.htaccess重写干净的URL

如何使用.htaccess重写干净的URL,.htaccess,redirect,url-rewriting,.htaccess,Redirect,Url Rewriting,我有以下.htaccess语言设置规则: RewriteRule ^en/?$ /index.php?lang=en [NC,L,R=301] RewriteRule ^fr/?$ /index.php?lang=fr [NC,L,R=301] RewriteRule ^de/?$ /index.php?lang=de [NC,L,R=301] 但是,当我输入干净的URL(例如example.com/fr)时,URL会重定向到浏览器中的example.com/index.php?lang=fr

我有以下
.htaccess
语言设置规则:

RewriteRule ^en/?$ /index.php?lang=en [NC,L,R=301]
RewriteRule ^fr/?$ /index.php?lang=fr [NC,L,R=301]
RewriteRule ^de/?$ /index.php?lang=de [NC,L,R=301]
但是,当我输入干净的URL(例如
example.com/fr
)时,URL会重定向到浏览器中的
example.com/index.php?lang=fr

URL如何保持干净

我尝试了以下操作,但也不起作用,URL无法保持干净:

RewriteRule ^/([^/]+)/? /index.php?lang=$1 [L,QSA,NC]
要防止外部重定向,只需删除
R
标志。这将成为一个内部重写,URL在浏览器地址栏中保持为
example.com/fr
。例如:

RewriteRule ^en/?$ /index.php?lang=en [NC,L]
为了在语言数量有限的情况下使其更简洁,您可以在正则表达式中使用交替将这三个指令组合为一个指令:

 RewriteRule ^(en|fr|de)/?$ /index.php?lang=$1 [NC,L]
$1
是对捕获的语言id的反向引用:“en”、“fr”或“de”

在测试之前,您需要清除浏览器缓存,因为浏览器可能缓存了任何错误的301s

这在
.htaccess
上下文中永远不会匹配,因为
RewriteRule
模式上有斜杠前缀。所以这没什么用。(如果请求仍被重定向,您可能会看到缓存响应?)。应改为:

RewriteRule ^([^/]+) /index.php?lang=$1 [L,QSA,NC]
模式上的尾随
/?
是多余的。但是,这与任何路径段都匹配。例如
example.com/about
example.com/foo/bar

RewriteRule ^/([^/]+)/? /index.php?lang=$1 [L,QSA,NC]
RewriteRule ^([^/]+) /index.php?lang=$1 [L,QSA,NC]