我正在做一个多语言的动态网站,每种语言创建一个虚拟路径。
所以法语页面会转到www.example.com英语www.example.com,但实际上这些页面在基本文件夹中,/fr/被转换为查询字符串。 domain.com/fr/ english domain.com/en/page domain.com/fr/some/page but in reality these pages are in the base folder and /fr/ is converted to a query string.
这一切都是通过以下. htaccess实现的:
RewriteEngine on
DirectorySlash Off # Fixes the issue where a page and folder can have the same name. See https://stackoverflow.com/questions/2017748
# Return 404 if original request is /foo/bar.php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]
# Remove virtual language/locale component
RewriteRule ^(en|fr)/(.*)$ $2?lang=$1 [L,QSA]
RewriteRule ^(en|fr)/$ index.php?lang=$1 [L,QSA]
# Rewrite /foo/bar to /foo/bar.php
RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]
我的问题是有些网站(比如LinkedIn帖子)不知何故会自动删除索引页中的尾随/。所以如果我在我的帖子www.example.com中添加一个链接,他们不知何故会将链接设置为domain.com/fr,即使它显示的是domain.com/fr/,但404的domain.com/fr并不存在。domain.com/fr/ somehow they make the link domain.com/fr even if it shows domain.com/fr/ but that 404's as domain.com/fr dosent exist.
那么,如何将www.example.com重定向到www.example.com或将localhost/mypath/fr(我的本地工作站中有许多站点)重定向到localhost/mypath/fr/呢? domain.com/fr to domain.com/fr/ or localhost/mypath/fr (There's many sites in my local workstation) to localhost/mypath/fr/.
我试过这样的方法:
RewriteRule ^(.*)/(en|fr)$ $1/$2/ [L,QSA,R=301]
RewriteRule ^(en|fr)$ $1/ [L,QSA,R=301]
但这最终以某种方式在url中添加了完整的真实计算机路径:本地主机/我的路径/fr成为本地主机/我的路径/fr/中的Web服务器的路径
我将非常感谢一些帮助,因为我还没有找到正确的规则。
谢谢
1条答案
按热度按时间gk7wooem1#
您只是缺少了 * substitution * 字符串上的斜杠前缀。因此,Apache会将directory-prefix应用于 * relative * URL,从而导致格式错误的重定向。
例如:
现在,* substitution * 是一个根目录相对的URL路径,Apache只是将scheme + hostname作为外部重定向的前缀(这里不需要
QSA
标志,因为默认情况下会附加任何查询字符串)。这需要在现有重写之前(以及
.php
请求的阻塞规则之后)执行。注意,"内部重写"指令没有斜杠前缀是正确的。
请注意,如果禁用了目录斜杠,则必须确保自动生成的目录列表(mod_autoindex)也被禁用,否则,如果请求的目录没有尾部斜杠,则会生成目录列表(暴露文件结构),即使该目录中可能存在DirectoryIndex文档。
例如,在
.htaccess
文件的顶部包含以下内容:这在生产服务器上工作。因为站点在服务器根目录中。您知道如何在我的本地主机上尝试"捕获"此问题吗?
RewriteRule ^(.*)/(en|fr)$ /$1/$2/ [L,R=301]
没有发送捕获,但只有RewriteRule ^(en|fr)$ /$1/ [L,R=301]
localhost/mypath/fr
变为localhost/fr/
因此,我假设
.htaccess
文件位于本地开发服务器上的/mypath
子目录中。RewriteRule
* pattern *(第一个参数)将URL路径 * relative * 与.htaccess
文件的位置匹配(因此它与/mypath
不匹配)。然后,可以在包含整个(根相对)URL路径的 * substitution * 中使用REQUEST_URI
服务器变量。例如:
REQUEST_URI
服务器变量已包含斜杠前缀。这个规则在开发(子目录)和生产(根目录)中都可以正常工作,所以如果您需要用一个
.htaccess
文件同时支持这两种环境,应该用它来代替上面的规则。