编辑

编辑

几天来我一直在互联网上搜索,我认为我已经尝试了几乎所有的方法来在我的 Ubuntu 服务器上设置一些虚拟主机,但除了chmod 777在 webroot 上之外的所有方法都失败了。

我的默认 Apache 配置指向 /home/server/public_html,其设置如下所示

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /home/server/public_html/
    <Directory />
            Options FollowSymLinks
            AllowOverride All
    </Directory>
    <Directory /home/server/public_html/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from all
</Directory>

</VirtualHost>

然后,我为正在进行的项目创建了一个虚拟主机,例如 project.name.co.uk.conf,其中有以下内容

<VirtualHost *:80>
    ServerName http://www.local.dirty-briefs.co.uk
    ServerAlias local.project-name.co.uk
    DocumentRoot /home/server/public_html/project-name/
    DirectoryIndex index.php index.html
</VirtualHost>

然后我运行sudo a2ensite project.name.co.uk.conf。我正在使用 samba 在 Windows 7 机器上工作以访问服务器上的文件。我将 project.name.co.uk 添加到我的 Windows Hosts 文件中,但无论我做什么,我都会收到 403 权限错误。

编辑

我想添加 Apache 错误日志的尾部,以防有用

*==> /var/log/apache2/error.log <==
[Sat Jun 11 13:22:23 2011] [error] [client 192.168.0.3] PHP Warning:          require(/home/server/public_html/dirty-briefs/site/protected/config/main.php): failed to open stream: Permission denied in /home/server/public_html/dirty-briefs/framework/base/CApplication.php on line 120
[Sat Jun 11 13:22:23 2011] [error] [client 192.168.0.3] PHP Fatal error:  require(): Failed opening required '/home/server/public_html/dirty-briefs/site/protected/config/main.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/server/public_html/dirty-briefs/framework/base/CApplication.php on line 120*

也许还值得一提的是,我正在使用 Yii PHP 框架,我的站点文件夹中有一个 .htaccess 文件,其中包含以下内容

    # Disable directory browsing
    Options All -Indexes

    # File types
    AddType application/x-font-woff .eot .ttf       # Font-Face


    # URL Rewriting
    <IfModule mod_rewrite.c>
    RewriteEngine On

    # Site Maintenance
    # RewriteCond %{REMOTE_ADDR} !^10\.0\.2\.2
    # RewriteCond %{REQUEST_FILENAME} !-f
    # RewriteRule ^(.*)$ /maintenance.html [L]

            
    # LOCAL 
    RewriteCond %{SERVER_NAME} ^local.project-name.co.uk
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /index-local.php/$1
    # -----

    # PRODUCTION
    RewriteCond %{HTTP_HOST} ^project-name.co.uk
    RewriteRule ^(.*)$ http://www.project-name.co.uk/$1 [R=301,L]

    RewriteCond %{SERVER_NAME} ^www.project-name.co.uk
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /folder/index.php/$1
    # -----
    </IfModule>

我跟踪了 Apache 错误和访问日志,发现由于权限错误,在 PHP 脚本中导入文件时出现了永久错误。

我已经阅读了有关检查 Apache 在哪个用户和组下运行的信息,它们是 www-data www-data,所以我猜测 Apache 基本上没有权限访问 /home/server/public_html 下的文件,除非我给文件夹 777 权限,而我不想要这个权限,所以我只是想知道是否有人可以发现我做错了什么,或者就我可以尝试让它工作的任何建议

答案1

此文件夹布局有点混乱。您的默认 vhost 指令指定/home/server/public_html/DocumentRoot,但随后您指定了子文件夹将其作为应用程序的根目录。这不是最佳配置。尝试将站点移出public_html到其自己的文件夹(/home/server/project或类似文件夹)并进行相应设置DocumentRoot

一旦移动,您就不需要777权限来使其可访问,尽管它确实需要可读www-data。尝试:

chmod -R 644 /home/server/project   
find /home/server/project -type d -exec chmod 755 {} \+

这将使所有内容都可供全世界读取,并且所有文件夹都可遍历(在文件夹上设置执行位可以实现这一点)。

还有一件事:ServerName不使用http://前缀。您应该从配置中删除它,只保留域名。

更改后重新启动 apache,您就能够使用给定的主机名访问站点。

答案2

您可以授予 Apache 访问文件的权限,而无需将其设置为 world-can-do-everything(rwxrwxrwx 或 777),您只需授予它读取文件的权限,以便 PHP 可执行文件可以读取它们。如果 PHP 检查执行权限,您可能还需要授予执行权限。更好的方法是使用 更改所有权,然后chown www-data:www-data <file>您可以授予 Apache 完全权限,而其他任何人(root 除外)则不授予任何权限chmod 700(或者chmod u+rwx <file>; chmod go-rwx <file>如果您更喜欢使用助记符代码而不是基于位模式的代码)。

如果你有其他网站从同一个 Apache 安装运行(因此也以 的身份运行www-data),并且你想将它们分开,以便一个网站在某种程度上受到其他网站的保护,那么请考虑使用suPHPUbuntu 中的这个软件包提供了)。它比标准的 mod_php 效率低(除非您的硬件条件非常有限,否则效率不会低很多),但它为用户/网站之间提供了额外的保护层,使它们(意外或以其他方式)更难相互影响或读取彼此的内容。每个脚本都由充当拥有它的用户的进程运行,因此 user1 拥有的 php 文件以 user1 的身份运行,而其他用户(甚至 www-data 或通常以其他身份运行的脚本)不需要任何访问它。在正确设置之前,您可能会遇到 suphp 的其他权限错误,因为它默认坚持在运行任何脚本之前通过某些安全检查(例如目录和脚本不是全局可写的)。

附言:回复require(/home/server/public_html/dirty-briefs/site/protected/config/main.php): failed- 沾满咖啡渍的会议简报,还是别的什么?!

答案3

您可能需要执行访问权限,/home/server以便 Apache 用户可以在其中遍历以读取该public_html文件夹(该文件夹应该是其他人可读的)。

# If not already drwx--x--x...
chmod o+x /home/server

答案4

这可能是 seLinux 的问题。

编辑:

为确保安全,您可以将 seLinux 设置为宽容模式,然后重试。如果您使用的是 RedHat,我建议您使用 system-config-selinux,但我不知道 Ubuntu 中是否有这样的工具

相关内容