Технические характеристики системы:
Amazon Linux AMI, выпуск 2017.03
Apache / 2.4.33 (Amazon)
PHP 5.6.36
DNS обрабатывается Cloudflare
Вот мои VirtualHosts:
<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.