如何处理公共目录放置在公共目录中的PHP项目

时间:2015-05-18 07:30:29

标签: php apache .htaccess mod-rewrite

假设你有一个像这样的PHP项目:

/config/
/lib/
/public/ -- Only this folder is supposed to be public.

但它已完全上传到Apaches公共目录。由于某些用户可能不知道他们在做什么,或者网络主机只允许访问公共目录。

是否有用于处理此类情况的PHP / .htaccess解决方案?

最好不要访问config和lib目录,并且像 /img/header.png 这样的URI仍然有效。

公共目录还包含一个.htaccess文件,会破坏mod_rewrite解决方案吗?

修改

Haven还能够解决这个问题。这里有一些关于手头问题的更详细信息。

/public/目录中,我有一个index.php文件和其他公共文件,如JavaScript,CSS和图像在它们各自的目录中。我这里也有我的.htaccess文件。此文件包含此mod_rewrite代码:

RewriteEngine On
Options +FollowSymlinks

# Set %{ENV:PROTO} variable, to allow rewrites to redirect with the
# appropriate schema automatically (http or https).
RewriteCond %{HTTPS} =on
RewriteRule ^ - [env=proto:https]
RewriteCond %{HTTPS} !=on
RewriteRule ^ - [env=proto:http]

# Rewrite www.example.com → example.com
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]

# Block access to all hidden files and directories with the exception of
# the visible content from within the `/.well-known/` hidden directory.
RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]

RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]

在httpd的公共目录为/public/时工作正常,但我要求的是一种抵消用户可能直接将项目文件上传到公众的可能性的方法。目录

e.g。我的目录最终如下。

/public_html/config/
/public_html/lib/
/public_html/public/

我试图在我的项目根目录中使用.htaccess文件来抵消这个但是没有运气。即使我将流量重定向到/public_html/public/.htaccess中的/public_html/public/也会覆盖重定向到mod_rewrite的{​​{1}}代码。

5 个答案:

答案 0 :(得分:1)

您可以在所有目录中拒绝使用.htaccess访问非公共目录,包括指令:

deny from all

答案 1 :(得分:1)

像这样的东西

RewriteEngine on
RedirectMatch 403 ^/.*/(cache|config|lib|system/lib|logs|\.git|\.hg).*$

答案 2 :(得分:0)

您可以将.htaccess文件放在您不希望通过以下内容访问的每个目录中:

deny from all

答案 3 :(得分:0)

您没有指定是否可以通过URL从LOCAL主机访问/ config /和/ lib /目录。

如果您不想访问https://stackoverflow.com/users/4893165/benoit-lacherez上面的任何解决方案

deny from all

如果您想从已知的IP地址,网络或localhost访问,请将.htaccess文件放入您要限制访问的每个目录中并添加以下内容(您必须更改某些数字)

oder allow, deny
deny from all
allow from 127.0.0.1
allow from YOUR.IP.ADD.RESS

您还可以放置以下行以从网络进行访问:

allow from 192.168.0.0

答案 4 :(得分:0)

好;这就是我想出的。这简直太简单了。

我的项目根目录中的.htaccess文件包含:

RewriteEngine On
RewriteRule ^(.*) public/$1 [L,PT]

我将以下内容添加到我的项目公用文件夹中的.htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L,PT]

它似乎独立于现在上传的位置。即使非公共文件夹存在,您也无法访问它们。因为所有请求都会发送到公共文件夹中不存在文件的index.php

我唯一不喜欢的是您仍然可以将/public/添加到URI并获取相同的页面。它不像我在公共目录中有第二个公共目录所以它不应该是一个问题。