在 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
- 但这会影响所有相对替换。您还可以使用环境变量将特定前缀仅应用于某些规则。
在 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
- 但这会影响所有相对替换。您还可以使用环境变量将特定前缀仅应用于某些规则。