web服务器在执行.htaccess URI重写时不包括查询字符串

web服务器在执行.htaccess URI重写时不包括查询字符串,.htaccess,mod-rewrite,url-rewriting,qsa,.htaccess,Mod Rewrite,Url Rewriting,Qsa,我在GitHub上发布了一些网页代码,很多人都在使用它,没有问题。但是,就在最近,一个人联系我,让我知道他们有一个图像显示不正确的问题。该图像是由一个php文件生成的,我使用.htaccess重写在URL中将该文件称为.png,但在web服务器上内部处理为.php 我的理解是,默认情况下,apache服务器应该在URI重写中包含原始查询字符串,但此人的web服务器没有这样做。这是第一个报告此问题的人,我无法在已测试的web服务器上复制此问题。我不确定此人的web服务器环境 这是用户报告的错误图像

我在GitHub上发布了一些网页代码,很多人都在使用它,没有问题。但是,就在最近,一个人联系我,让我知道他们有一个图像显示不正确的问题。该图像是由一个php文件生成的,我使用.htaccess重写在URL中将该文件称为.png,但在web服务器上内部处理为.php

我的理解是,默认情况下,apache服务器应该在URI重写中包含原始查询字符串,但此人的web服务器没有这样做。这是第一个报告此问题的人,我无法在已测试的web服务器上复制此问题。我不确定此人的web服务器环境

这是用户报告的错误图像输出:

上图中返回的结果表示需要服务器id。sid位于查询字符串中,但被忽略。在其他web服务器上,它运行良好

这就是图像输出的外观(避免.htaccess重写时):

这是用户报告问题之前的.htaccess实现:
重新启动引擎
重写规则^(.*)\.png$1.php[NC]

这是我试图修复(未成功)报告的问题:
重新启动引擎
重写规则^(.*)\.png$1.php?%{QUERY\u STRING}[QSA,NC,L]

您能否向我解释为什么该用户的web服务器不包含查询字符串和/或您能否帮助我实施一项更改,以纠正该用户的问题


谢谢大家!

用户的web主机声明:

我的答复是:

我真的希望他们能解释一下以下.htaccess代码的“过时”之处。比如,具体来说,什么?因为我在下面没有看到任何“旧的”重写命令。以下所有“旧”命令在“新”2.4文档中都列为完全有效

重新启动引擎
重写规则^(.*)\.png$1.php[NC,L]

您的web服务器正在按预期重写URI;因此,它正在发挥作用。不起作用的部分是,您的web服务器正在从末尾截断查询字符串。他们能解释吗

默认情况下,查询字符串的传递方式不变。但是,您可以在包含查询字符串部分的替换字符串中创建URL。只需在替换字符串内使用问号,指示应将以下文本重新注入查询字符串。如果要删除现有查询字符串,请仅以问号结束替换字符串。要组合新查询字符串和旧查询字符串,请使用[QSA]标志

所以,请询问他们,为什么他们的服务器没有按照它所说的“默认”运行

是不是因为我不包括这些东西

DocumentRoot”/var/www/example.com“

我当然希望不会。我希望per directory.htaccess文件不需要这些信息,并且可以毫无问题地理解它们的位置和范围。我不能包含丢失的信息,因为我无法猜测用户的web服务器目录结构以确定DocumentRoot,也无法猜测用户可能放置我的网页代码的子目录

“旧的”和“新的”Apache文档在这方面有相同的要求,它在“旧的”服务器上工作得非常好;因此,它在“新”服务器上也应该工作得很好。事实上,它在您的web服务器上运行得非常好(它正在按预期重写文件名);只是由于某种原因,您的web服务器正在截断查询字符串


事实上,我测试的服务器版本是Apache2.4.23;所以它是“新”的Apache。请让他们解释。

服务器主机已确定其web服务器正在切断查询字符串,因为扩展名为PNG,PNG图像具有查询字符串是不正常的。我同意PNG图像有查询字符串是不正常的,但是扩展名必须是PNG,URL必须包含附加信息(因此我选择使用查询字符串)。奇怪的是,到目前为止,它在这么多不同的web服务器上为这么多人工作得很好

也就是说,我将不得不重新考虑我的网页代码,将附加信息包含到URL中的文件名中,并从中提取


有人吗?这里有点寂寞