在 Apache 中如何使用子文件夹 .htaccess 文件外部重定向到 URL 的无斜杠版本

In Apache how to do an external redirect to the slashless version of a URL with a subfolder .htaccess file

在 Apache 2.4 上,我有一个 .htaccess(在子文件夹中),它将该文件夹内的无斜杠请求重写为适当的索引文件:

DirectorySlash Off

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule (.*) /index.html [L]

这完全符合预期,适用于 slashless 版本。现在我想将斜杠版本从外部重定向到无斜杠版本。我尝试添加以下行:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} /$
RewriteRule ^(.*)/  [R=302,L]

但是这不起作用:发出了重定向,但是它没有进入无斜杠 URL,而是进入了注入了系统特定部分的 URL。

因此,对于示例 URL http://example.com/path/to/dir/,重定向的 URL 看起来像这样 http://example.com/fs9e/username/sub/public/path/to/dir 而不是 http://example.com/path/to/dir.

我该如何解决这个问题?非常感谢任何指点!


PS:实际情况稍微复杂一些,因为我在根 .htacces 中进行了子域到文件夹的重写,但我认为这与此处无关。

RewriteRule ^(.*)/  [R=302,L]

您在 替换 字符串(第二个参数)上缺少斜杠前缀 (/) - 以进行替换 root-relative。或者更确切地说,/subfolder/(因为此 .htaccess 文件位于子文件夹中)。由于这是一个 relative 替换字符串(不以斜杠或方案+主机名开头),因此 directory-prefix*1(我假设是/fs9e/username/sub/public/path/)被加回去(默认情况下*2),导致格式错误的重定向。 (这适用于内部重写,但不适用于外部重定向。)

应该是这样的:

RewriteRule ^(.*)/$ /subfolder/ [R=302,L]

请注意,您还缺少 RewriteRule 模式 上的 end-of-string 锚点 ($)。 (这也不需要前面的 条件 检查 REQUEST_URI 是否以斜杠结尾。)

另请注意,此“重定向”应该在较早的“重写”之前进行。


*1 directory-prefix 是 .htaccess 文件位置的绝对文件系统路径。

*2 另一种方法是设置 RewriteBase /subfolder - 但这会影响所有相对替换。您还可以使用环境变量将特定前缀仅应用于某些规则。