Apache, похоже, игнорирует мой файл.htaccess, несмотря на то, что mod_rewrite включен и AllowOveride all
Технические характеристики системы:
Amazon Linux AMI выпуск 2017.03
Apache / 2.4.33 (Amazon)
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), означающее, что "публичный" каталог, указанный выше для DocumentRoot для моего VirtualHost, содержит скрипт 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 DNS A работает - я добираюсь до сервера. Кажется, что VHosts работает, так как apache ищет файлы в правильном корне документа. Это похоже на то, как если бы apache игнорировал файл.htaccess в этом каталоге, который должен взять что-либо в пути URL-адреса и передать его в скрипт index.php.
Как я могу узнать, знает ли Apache о.htaccess, не говоря уже о его анализе?
Изменить: в соответствии с предложениями в комментариях я попытался добавить мусор в файл.htaccess, чтобы увидеть, если Apache вызвал ошибку страницу - не повезло. Такое же поведение В качестве контроля я попробовал это на другом (работающем) сервере и увидел обычную страницу ошибок Apache с жалобами на неправильную конфигурацию. Так что это говорит мне, что apache либо не видит, либо намеренно игнорирует мой.htaccess.