7

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

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

这个简单的重写:

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(没有尾随 /)时,URL 将像http://example.com/private/project3/在浏览器中一样可见。为什么 ?我怎样才能避免这种情况?

4

3 回答 3

5

在您的情况下,您只需要 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 并仅为您的本地网络启用重写。

于 2012-08-12T00:17:02.617 回答
2

实际上,查看您的问题,这似乎是 mod_dir 干扰路径管道的问题。具体来说,DirectorySlash默认情况下打开,当它认为浏览器正在请求目录并且缺少尾部斜杠时,将 301 重定向浏览器。您可以尝试转动DirectorySlash Off,但有一个与之相关的安全警告

关闭尾部斜杠重定向可能会导致信息泄露。考虑 mod_autoindex 处于活动状态(选项 +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 总是能很好地相互配合,结果好坏参半。

于 2012-08-12T00:50:33.857 回答
2

虚拟域还不够吗?

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

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

于 2012-08-12T08:52:19.460 回答