尽管启用了 mod_rewrite 并且 AllowOveride all,Apache 似乎忽略了我的 .htaccess 文件

尽管启用了 mod_rewrite 并且 AllowOveride all,Apache 似乎忽略了我的 .htaccess 文件

系统规格:

  • 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。

相关内容