2

在我的服务器上,我有多个域。

RewriteEngine On
RewriteBase /

# 1. Redirect multiple domains to http://domain.de/
RewriteCond %{HTTP_HOST} !^(www\.)?domain\.de [NC]
RewriteRule ^/?(.*) http://domain.de/$1 [L,R,NE]

# 2. Redirect all requests to /subdirectory
RewriteRule ^$ /subdirectory [L]

2. 规则工作正常,但它没有隐藏 url 中的子目录,也没有按预期工作:请求http://domain.de/content/image.png返回 404,因为实际文件位于http://domain.de/subdirectory/content/image.png

此外,我有一些带有工具的文件夹位于子目录旁边/subdirectory。我想确保我仍然可以访问它们。这目前正在工作。

问题

我如何确保请求http://domain.de/content/image.png有效?

我试过的

RewriteCond %{REQUEST_URI} !^/subdirectory/
RewriteRule (.*) /subdirectory/$1 [L]

但这只会在 apache 错误日志中返回错误 500,并带有以下条目:`由于可能的配置错误,请求超出了 10 个内部重定向的限制。

编辑

在 Ravi Thapliyal 提供指导之后,(我猜)还剩下一件事:从 url 中删除子目录。

[user@domain html]$ curl -I domain.de/
HTTP/1.1 301 Moved Permanently
Date: Mon, 21 Oct 2013 12:42:22 GMT
Server: Apache/2.2.22 (Ubuntu)
Location: http://domain.de/subdirectory/index.php
Vary: Accept-Encoding
Content-Type: text/html

这是返回的内容,但我实际上想要获取 html 而不是位置标头,然后它当然会将我从外部重定向到子目录,然后用户可以看到该子目录。它可能与子目录中的另一个 .htaccess 文件有关吗?

编辑2

似乎问题与subdirectory. 接受的答案按预期工作。

4

1 回答 1

2

您的第一条规则应该进行外部重定向(在内部更改域根本不重要)

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.de [NC]
RewriteRule ^/?(.*)$ http://domain.de/$1 [R=301,L,NE]

您的第二条规则不是必需的。新规则也将涵盖根/请求。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_URI} ^/?$
RewriteCond %{REQUEST_URI} !^/subdirectory [NC]
RewriteRule ^(.*)$ /subdirectory/$1 [L]

这两个RewriteConds on%{REQUEST_FILENAME}将确保您可以访问外部存在的任何文件-f或目录。 -d/subdirectory


基本上,%{REQUEST_FILENAME} !-d如果 URL 路径指向任何现有目录,则该条件会阻止重定向。这可以防止 URL/existing-directory被重定向到/subdirectory/existing-directory.

但是,这也可以阻止根 URL/请求,这就是您收到目录索引禁止错误的原因。因此,上述条件也允许被重定向[OR]到。%{REQUEST_URI} ^/?$//subdirectory

于 2013-10-21T05:24:31.300 回答