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



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

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

这适用于无斜杠版本,与预期完全一样。现在我想从外部将斜杠版本重定向到无斜杠版本。我试着添加行:

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

然而,这不起作用:重定向被发出,但它不会指向无斜杠的URL,而是指向插入了系统特定部分的URL。

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

我该怎么解决这个问题?非常感谢你的指点!


PS:实际情况有点复杂,因为我在root.htaces中做了一个子域到文件夹的重写,但我认为这与此无关。

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

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

应该是这样的:

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

请注意,您还缺少RewriteRule模式上的字符串末尾锚($(。(这也否定了前面检查REQUEST_URI以斜线结束的条件的需要。(

还要注意的是;重定向";应该在较早的";重写";。


*1

目录前缀是.htaccess文件所在位置的绝对文件系统路径。*2另一种选择是设置RewriteBase /subfolder,但这会影响所有相对替换。您还可以使用环境变量仅将特定前缀应用于某些规则

最新更新