Клиент хочет укрепить свой основной бренд и консолидировать содержание различных доменов, используемых для соответствующих суббрендов в подкаталогах под капотом своего основного домена (бренда):
www.example.com
|_ .htaccess
|_ brand1
|_ files
|_ includes/header.inc
|_ scripts/functions.php
|_ brand2
|_ brand3
Все до сих поротдельные домены теперь указывают на www.example.com
, в .htaccess
корневые запросы переписываются на соотв.подкаталоги (некоторые домены обрабатываются индивидуально, так как домен / бренд не переводят один в один, но шаблон тот же):
RewriteCond %{HTTP_HOST} ^(www.)?(brand1|brand2|brand3)\.com$ [NC]
RewriteRule ^ https://www.example.com/%2%{REQUEST_URI} [R=301,L]
За этими директивами следует директива RewriteBase /
, а некоторые правила относятся к неполнымимена файлов (не каталогов) и передача изображений в скрипт для нанесения водяных знаков.
Обычно это работает нормально.Однако в журналах ошибок Apache (2.4) и PHP (7.2) есть ложные, но слишком частые, чтобы их игнорировать ошибки, из-за которых PHP include
не может найти файл или скрипт водяного знака не может загрузить файл изображения.
Сравнивая их с журналом доступа, выясняется, что в этих случаях запросы шли с двойной косой чертой:
"GET /brand1//path/to/file HTTP/1.1"
^^
, где path/to/file
представляет основанный на корне URI соответствующего бывшего отдельного домена.
Большинство, если не все, таких запросов поступают от поисковых роботов (Google, Yandex, Bing / MSN).Тем не менее, эти же боты также выдают правильные запросы, и я не могу повторить двойные слэши в браузере для тех же файлов, не используя ни старые (переписанные), ни новые (текущие) URL.
Очевидно, что это может бытьисправлено RewriteRule ^\/?(.*)$ https://www.example.com/$1 [R=301,L]
(ср. https://stackoverflow.com/a/4278042 и др.), но я бы предпочел сокрушить ошибку в ее корне, если это возможно.
Спасибо за любую информацию / предложение / помощь.
РЕДАКТИРОВАТЬ:
В случае выше GET /brand1//path/to/file HTTP/1.1
В журнале доступа Apache указаны коды возврата либо 200, либо 500 (не удалось увидеть шаблон) и 404, если файл действительно отсутствует,Преднамеренный ввод URL-адреса с двойной косой чертой в браузере отображает страницу с точностью до include
.
Для <?php include 'includes/header.inc' ?>;
в журнале ошибок PHP указано
PHP Warning: include(/home/http/htdocs/example/brand1/path/to/file/brand1/path/to/functions.php): failed to open stream: No such file or directory in /mnt/webnnn/htdocs/example/brand1/path/to/header.inc on line XX
/home/http/htdocs/example/brand1/path/to/file
включает в себя header.inc
(пока это работает; относительный путь), который, в свою очередь, включает str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']) . '/brand1/path/to/functions.php'
.
(хост-сервер возвращает неправильный путь в $ _SERVER ['DOCUMENT_ROOT']], поэтому str_replace(...)
,который работает нормально, если не происходит двойной косой черты, нарушая соответствие. До сих пор я отслеживал это.)
Изображения, переданные в .htaccess
в сценарий с водяными знаками brand1/watermark.class.php
повышение
PHP Warning: exif_imagetype(/path/to/image.jpg): failed to open stream: No such file or directory in /mnt/webnnn/htdocs/example/brand1/watermark.class.php on line XX
с первой косой чертой, совпадающей с двойной косой чертой в журнале Apache (без них это imagecreatefromjpeg(path/to/image.jpg)
).
Тем временем я пересмотрел обработку ошибок в watermark.class.php
, больше не полагаясь на -s
флаг и другие условия в .htaccess
.Перезапись URL с двойным слешем тоже работает, но я до сих пор понятия не имею, откуда они берутся.