如何使用mod重写从父

时间:2015-05-12 20:55:04

标签: regex apache .htaccess mod-rewrite

我尝试使用重写规则配置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/

2 个答案:

答案 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