.htaccess 用于将语言重写为查询字符串的Mod_重写规则
我正在使用.htaccess中的以下命令将url中指定的语言转换为查询字符串:.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
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
实际上不是一个文件夹,但它内部重写的是什么),所以我想这取决于您的实现方式。