Apache mod_rewrite

时间:2018-06-25 16:23:25

标签: apache .htaccess mod-rewrite

客户希望增强自己的主品牌,并在其主域名(品牌)的框架下将子目录中各个子品牌使用的各个域名的内容合并:

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最初来自何处。

0 个答案:

没有答案