我尝试使用重写规则配置Apache,以便" parent"网站可以指向一个孩子"现场。我尝试上班的目录结构如下:
parent/
index.html
children/ # Logically this should point to container/000
.htaccess
some-other-file.html
container/
000/
childA/
index.html
我希望parent/children
下的任何不存在的请求都来自磁盘上其他位置的另一个目录。在此处的示例中,目录为container/000
。
我目前在父网站的.htaccess
文件中有这个重写规则。
#
# parent/children/.htaccess
#
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /container/000/$1
这适用于ChildA
中的文件,以及ChildA
目录(如果它以斜杠结尾)。但是,如果我将斜线从孩子身上移开,我会使用重写路径获得301重定向,这不是我想要的。
示例:
mysite.com/parent/children/childA/index.html # Works fine
mysite.com/parent/children/childA/ # Also works, serves index
# This doesn't do what I want
mysite.com/parent/children/childA
最后一个示例提供了正确的页面,但我获得了301重定向到mysite.com/container/000/childA/
。我想要的是重定向到mysite.com/parent/children/childA/
,这是原始请求,但带有斜杠。
我怎样才能做到这一点?
我尝试添加AllowNoSlash
重写选项,但这没有帮助。我已经看到了使用重写规则向目录添加缺失斜杠的其他示例,但是这些假设请求映射到现有目录...在我的情况下,请求的目录不存在。
前两个答案没有帮助。我仍然得到301重定向到容器目录下的路径。
我不确定它是否相关,但我还有一个带有 VirtualDocumentRoot 的 VirtualHost 。我正在添加服务器配置并扩展上面的示例。
<Directory /sites>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory /sites/container>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Alias /container /sites/container
<VirtualHost 127.0.0.1:80>
ServerName localhost
ServerAlias *
VirtualDocumentRoot /sites/%-2.1/%-2.2/%-2.0.%-1/
</VirtualHost>
sites
├── container
│ ├── 000
│ │ └── childA
│ │ └── index.html
│ └── .htaccess
└── p
└── a
└── parent.com
├── children
│ ├── .htaccess
│ └── index.html
└── index.html
parent.com/children/childA/index.html # Works fine
parent.com/children/childA/ # Also works, serves index
# This gives me a 301 redirect to /container/000/childA/
parent.com/children/childA
来自@anubhava的建议看起来很有希望,但第一个重写规则无法匹配。
如果我在浏览器中输入parent.com/children/childA
,我会获得301重定向到parent.com/container/000/childA/
答案 0 :(得分:1)
默认情况下应启用此功能,但请尝试将其添加到.htaccess文件的顶部。
DirectorySlash On
我也会在我的规则中添加尾部斜杠,以使其成为可选项。并确保使用L
标志告诉它在匹配后停止处理。
#
# parent/children/.htaccess
#
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ /container/000/$1 [L]
答案 1 :(得分:0)
如果当前REQUEST_URI是目录,mod_dir
之后mod_rewrite
模块会添加尾部斜杠。
要解决此问题,您可以遵循以下规则:
# parent/children/.htaccess
Options +FollowSymLinks -MultiViews
RewriteEngine On
# add a trailing slash to rewritten directories
RewriteCond /sites/container/000/$1/ -d
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L,R=302,NE]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /container/000/$1