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