Apache重写规则将所有请求重定向到包含另一个.htaccess和重写规则的子目录

时间:2012-08-02 19:01:32

标签: apache mod-rewrite

我的网络服务器上有公共和私人项目。我将所有公共内容放入网络服务器根目录,然后我有一个private文件夹,我只能从本地网络访问(由.htaccess设置)。

我想简单地将每个私有项目放在private文件夹中并自动处理请求,但希望URL看起来像是从webroot提供的。
例如,如果private/project1我想使用网址http://example.com/project1来提供该文件夹,并且不想更改网址。

这个简单的重写:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ private/$1           

有效,但当我有一个private/project2与另一个.htaccess

Options +FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /project2/

<Files .*>
       Order Deny,Allow
       Deny From All
</Files>

# Allow asset folders through
RewriteRule ^(assets/.+) - [L]

# Protect files from being viewed
RewriteRule ^(uploads.+) - [F,L]


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php/$1 [L]

</IfModule>
Options -Indexes

然后会出现静态内容,但链接会被破坏。 我应该修改什么才能工作?

此外,如果我有private/project3并浏览到http://example.com/project3/则没有问题,但当我浏览到http://example.com/project3(没有尾随/)时,该网址将显示为{{ 1}}在浏览器中。为什么?我怎么能避免这种情况?

3 个答案:

答案 0 :(得分:4)

您需要的只是mod_alias。

然后为您的私人项目提供服务:

Alias /project3 /apache/htdocs/private/project3

使用.htaccess,您将控制访问权限。

如果你想在不重新启动服务器的情况下控制它,你可以尝试使用以下配置实现这一点,该配置可以放在.htaccess文件中:

RewriteRule ^/(project1)$ /private/$1/index.html
RewriteRule ^/(project1/)(.*)$ /private/$1$2

index.html - 项目的任何索引文件。 这样,除了用于私有项目的路径之外,URL的公共部分将完全可访问。 您还可以添加RewriteCond以检查IP并仅为本地网络启用重写。

答案 1 :(得分:2)

实际上,查看你的问题看起来这是mod_dir干扰路径管道的问题。具体来说,默认打开的DirectorySlash将在浏览器认为浏览器正在请求目录并且缺少尾部斜杠时重定向浏览器。您可以尝试转动DirectorySlash Off,但有一个security warning associated with it

  

关闭尾部斜杠重定向可能会导致信息泄露。考虑一下mod_autoindex处于活动状态(Options + Indexes)并且DirectoryIndex设置为有效资源(例如index.html)的情况,并且没有为该URL定义其他特殊处理程序。在这种情况下,带有斜杠的请求将显示index.html文件。但是没有尾随斜杠的请求将列出目录内容。

这可能适用于您的设置,也可能不适用。您还可以尝试修改重写规则以考虑尾部斜杠:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ private/$1/     

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ private/$1/     

但是我试图让mod_rewrite和mod_dir始终很好地相互配合,结果好坏参半。

答案 2 :(得分:2)

虚拟域不够用吗?

您可以将域用于私有项目,将另一个域用于公共项目。

http://httpd.apache.org/docs/2.2/vhosts/examples.html