我怎样才能创建一个重定向.htaccess正确的路径,而不是页面访问

qlckcl4x  于 2023-02-09  发布在  其他
关注(0)|答案(1)|浏览(119)

我正在做一个多语言的动态网站,每种语言创建一个虚拟路径。
所以法语页面会转到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服务器的路径
我将非常感谢一些帮助,因为我还没有找到正确的规则。
谢谢

gk7wooem

gk7wooem1#

RewriteRule ^(en|fr)$ $1/ [L,QSA,R=301]

您只是缺少了 * substitution * 字符串上的斜杠前缀。因此,Apache会将directory-prefix应用于 * relative * URL,从而导致格式错误的重定向。
例如:

RewriteRule ^(en|fr)$ /$1/ [L,R=301]

现在,* substitution * 是一个根目录相对的URL路径,Apache只是将scheme + hostname作为外部重定向的前缀(这里不需要QSA标志,因为默认情况下会附加任何查询字符串)。
这需要在现有重写之前(以及.php请求的阻塞规则之后)执行。
注意,"内部重写"指令没有斜杠前缀是正确的。

  • 旁白 *
DirectorySlash Off

请注意,如果禁用了目录斜杠,则必须确保自动生成的目录列表(mod_autoindex)也被禁用,否则,如果请求的目录没有尾部斜杠,则会生成目录列表(暴露文件结构),即使该目录中可能存在DirectoryIndex文档。
例如,在.htaccess文件的顶部包含以下内容:

# Disable auto-generated directory listings (mod_autoindex)
Options -Indexes
    • 更新日期:**

这在生产服务器上工作。因为站点在服务器根目录中。您知道如何在我的本地主机上尝试"捕获"此问题吗?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服务器变量。
例如:

RewriteRule ^(en|fr)$ %{REQUEST_URI}/ [L,R=301]

REQUEST_URI服务器变量已包含斜杠前缀。
这个规则在开发(子目录)和生产(根目录)中都可以正常工作,所以如果您需要用一个.htaccess文件同时支持这两种环境,应该用它来代替上面的规则。

相关问题