.htaccess 用于将语言重写为查询字符串的Mod_重写规则

.htaccess 用于将语言重写为查询字符串的Mod_重写规则,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我正在使用.htaccess中的以下命令将url中指定的语言转换为查询字符串: RewriteEngine On RewriteBase / RewriteRule ^(en|fr)/(.*)$ $2?language=$1 [L,QSA] 当我输入以下任何一项时,它会按预期工作: mydomain.com/en/ mydomain.com/en/about/ mydomain.com/en/about/index.php 但如果我输入以下内容: mydomain.com/en/about

我正在使用.htaccess中的以下命令将url中指定的语言转换为查询字符串:

RewriteEngine On
RewriteBase /
RewriteRule ^(en|fr)/(.*)$  $2?language=$1 [L,QSA]
当我输入以下任何一项时,它会按预期工作:

mydomain.com/en/
mydomain.com/en/about/
mydomain.com/en/about/index.php
但如果我输入以下内容:

mydomain.com/en/about
(无尾随斜杠),浏览器重定向到

mydomain.com/en/about/?language=en
除了应该是内部重写之外,哪个是正确的目标。我不想在浏览器位置栏中看到这一点


我遗漏了什么?

您需要关闭mod_dir并在内部处理后面的斜杠。也许是这样的:

DirectorySlash Off
RewriteEngine On
RewriteBase /

# handle post-rewrite trailing slashes
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L,R]

# handle pre-rewrite trailing slashes
RewriteCond %{DOCUMENT_ROOT}/$2 -d
RewriteRule ^(en|fr)/(.*[^/])$ /$1/$2/ [L,R]

RewriteRule ^(en|fr)/(.*)$  $2?language=$1 [L,QSA]

在您的上一条规则内部重写之前,这应该接受像
mydomain.com/en/about
这样的请求,并将其重定向到
mydomain.com/en/about/

about
文件夹吗?mod_dir重定向缺少尾部斜杠的文件夹请求,
about
是一个文件夹。问题是mod_dir将整个过程转化为重定向,公开了我想要保留的内部部分(查询字符串)。谢谢。即使没有
目录slash Off
(因为您正在添加斜杠和重定向,mod_dir从来没有机会查看它),这似乎也能工作。是否有理由禁用它?我相信使用R=301进行这种重定向是最佳做法?@JasonWood根据我的经验,mod_dir在mod_rewrite之前处理请求,这可能不适合您(可能与加载模块的顺序有关?)。对于重定向,R=301可能更好,但请记住,您正在重定向不存在的URL(
/en/about
实际上不是一个文件夹,但它内部重写的是什么),所以我想这取决于您的实现方式。