系统规格:
Amazon Linux AMI 版本 2017.03
Apache/2.4.33(亚马逊)
PHP 5.6.36
DNS 由 Cloudflare 处理
这是我的虚拟主机:
<VirtualHost *:80>
DocumentRoot "/var/www/sub.mysite.com/app/public"
ServerName sub.mysite.com
<Directory "/var/www/sub.mysite.com/app/public">
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:443>
DocumentRoot "/var/www/sub.mysite.com/app/public"
ServerName sub.mysite.com
SSLEngine on
SSLCertificateFile /ssl/mykey.crt
SSLCertificateKeyFile /ssl/mykey.key
<Directory "/var/www/sub.mysite.com/app/public">
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
</Directory>
</VirtualHost>
并且位于该公共目录中的 .htaccess :
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
这是一个 Laravel(PHP)应用程序,这意味着上面引用的我的 VirtualHost 的 DocumentRoot 的“公共”目录包含一个作为应用程序入口点的 index.php 脚本和一个将所有请求推送到该脚本的 .htaccess 文件。
我已经确认 mod_rewrite 已通过apachectl -D DUMP_MODULES
和 phpinfo 启用。如上所示,AllowOverride All
已设置。文件的权限似乎也正确 - 如果我使用这个脚本在 /public 中,我得到了预期的结果(.htaccess 存在并且可被网络服务器读取)。
但是,据我所知,.htaccess 被忽略了。例如:如果我请求https://sub.mysite.com/admin/login,Apache 似乎将该路径视为一个明确的文件(通常将其推送到 index.php) - 摘自全局 apache error_log:
AH00128: File does not exist: /var/www/sub.mysite.com/app/public/admin/login
如果我在该公共目录下创建任意 PHP 脚本并直接浏览它,该脚本将按预期运行。
不管怎样,我不认为这是一个 Cloudflare 的问题——如果我在我的主机文件中使用域名对实际服务器的 IP 进行硬编码,我会得到完全相同的行为,而且我可以确认浏览器在这种情况下直接进入服务器而不是通过 cloudflare。
因此,Cloudflare DNS A 记录正在工作 - 我正在访问服务器。VHosts 似乎正在工作,因为 apache 正在正确的文档根目录中查找文件。就好像 apache 忽略了该目录中的 .htaccess 文件,这应该任何事物在 URL 的路径中并将其推送到 index.php 脚本。
我怎样才能知道 apache 是否知道 .htaccess,更不用说解析它了?
编辑:根据评论中的建议,我尝试向 .htaccess 文件中添加一些垃圾文件,看看 apache 是否弹出错误页面 - 没有运气。行为相同。作为对照,我在另一台(正常工作的)服务器上尝试了此操作,看到正常的 Apache 错误页面抱怨配置错误。所以这告诉我 apache 要么没有看到我的 .htaccess,要么故意忽略我的 .htaccess。