如何使用.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]