Ложные, но частые двойные косые черты в пути после Apache mod_rewrite - PullRequest
0 голосов
/ 25 июня 2018

Клиент хочет укрепить свой основной бренд и консолидировать содержание различных доменов, используемых для соответствующих суббрендов в подкаталогах под капотом своего основного домена (бренда):

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 с двойным слешем тоже работает, но я до сих пор понятия не имею, откуда они берутся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...