客户希望增强自己的主品牌,并在其主域名(品牌)的框架下将子目录中各个子品牌使用的各个域名的内容合并:
www.example.com
|_ .htaccess
|_ brand1
|_ files
|_ includes/header.inc
|_ scripts/functions.php
|_ brand2
|_ brand3
到目前为止,所有迄今单独的域都指向www.example.com
,根请求中的.htaccess
被重写为resp。子目录(某些域被单独视为域/品牌,不会一一对应,但是模式是相同的):
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和新的(当前的)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也可以,但是我仍然不知道这些URL最初来自何处。