请注意,可能导致此问题的另一个问题是,父目录的“FollowSymLinks”选项可能被项目目录的选项错误地覆盖。对我来说就是这种情况,让我拉头发,直到找到原因!
以下是此类错误的示例:
<Directory />
Options FollowSymLinks
AllowOverride all
Require all denied
</Directory>
<Directory /var/www/>
Options Indexes # <--- NOT OK! It's overwriting the above option of the "/" directory.
AllowOverride all
Require all granted
</Directory>
因此,现在如果您检查 Apache 的日志消息(tail -n 50 -f /var/www/html/{the_error_log_file_of_your_site}
),您将看到这样的错误:
Options FollowSymLinks and SymLinksIfOwnerMatch are both off, so the RewriteRule directive
is also forbidden due to its similar ability to circumvent directory restrictions
那是因为Indexes
在上面的/var/www
目录规则中覆盖FolowSymLinks
了/
目录。所以现在你知道了原因,为了解决它,你可以根据你的需要做很多事情。例如:
<Directory />
Options FollowSymLinks
AllowOverride all
Require all denied
</Directory>
<Directory /var/www/>
Options FollowSymLinks Indexes # <--- OK.
AllowOverride all
Require all granted
</Directory>
甚至这样:
<Directory />
Options FollowSymLinks
AllowOverride all
Require all denied
</Directory>
<Directory /var/www/>
Options -Indexes # <--- OK as well! It will NOT cause an overwrite.
AllowOverride all
Require all granted
</Directory>
上面的例子不会导致覆盖问题,因为在 Apache 中,如果选项是“+”,它将只覆盖“+”,如果是“-”,它将覆盖“-”...(尽管不要问我对此的参考,这只是我对 Apache 错误消息的解释(通过检查journalctl -xe
)说:Either all Options must start with + or -, or no Option may.
当一个选项有符号,但另一个没有(例如,FollowSymLinks -Indexes)。所以这是我个人的结论——因此应该持保留态度——如果我-Indexes
将其用作选项,Apache 将把它视为与“/”中的另一个选项完全不同的一组选项,其中上面没有任何标志,因此最终不会发生烦人的重写,我可以在我自己的项目目录中通过上述规则成功确认)。
希望这会帮助你减少你的头发!:)