Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存在mod_重写问题的虚拟主机(Apache)_Apache_Mod Rewrite_Virtualhost - Fatal编程技术网

存在mod_重写问题的虚拟主机(Apache)

存在mod_重写问题的虚拟主机(Apache),apache,mod-rewrite,virtualhost,Apache,Mod Rewrite,Virtualhost,我正在努力解决这一整天的问题,但没有成功,所以我希望有人能帮助我。我在http://localhost/,它为我托管的应用程序使用挂架。除此之外,我还需要托管一个PHP/MySQL站点,所以我也必须使用Apache 我当前的设置是将haproxy与Apache后端的以下配置一起使用: backend apache mode http timeout connect 4000 timeout server 30000 timeout queue 60000 balance roundrobin

我正在努力解决这一整天的问题,但没有成功,所以我希望有人能帮助我。我在
http://localhost/
,它为我托管的应用程序使用挂架。除此之外,我还需要托管一个PHP/MySQL站点,所以我也必须使用Apache

我当前的设置是将haproxy与Apache后端的以下配置一起使用:

backend apache

mode http
timeout connect 4000
timeout server 30000
timeout queue 60000
balance roundrobin

server app02-8002 localhost:8002 maxconn 1000
这是由以下因素触发的:

acl image url_sub images
use_backend apache if image
因此,当我打开我的IP/映像时,它将触发该事件,然后打开Apache,端口为8002

对于Apache,我创建了虚拟主机,这是“映像”主机:

所以,基本上,这是不起作用的。我想这个虚拟主机、子目录、重写或其他东西之间存在冲突,但我似乎无法将其隔离

当我打开IP/images/xxxx.jpg时,它会打开位于public_html/images/upload/original文件夹中的图像,这有点令人困惑,因此重写工作正在进行。其他规则似乎不起作用。所有的缩略图和较小的版本都没有正确地呈现(带有图标,小,中,方),所以这使得该网站非常不可持续

下面是开发服务器的链接:
http://localhost/images/


提前感谢您的时间和帮助

您应该做的第一件事是确定mod_rewrite是否实际上是问题的一部分,方法是通过重写的形式直接访问其中一个失败的URL,并验证您是否得到了预期的结果

事实上,问题可能只是针对较小分辨率的PHP脚本“不起作用”,而针对原始大小的PHP脚本起作用。下面的第一个URL很好地为我提供了一个图像;第二个应该给我一个相同图像的较小版本,但为我提供了HTTP 500:

http://106.186.21.176/images/controller/Resizer.php?m=original&a=q&e=png  
http://106.186.21.176/images/controller/Resizer.php?m=small&a=q&e=png
我得到了相同的结果(HTTP 500),用于您文章中提到的任何较小的格式名称,这与您的问题描述相匹配

一旦您验证了脚本按预期工作,问题很可能是mod_rewrite。如果是这样,请启用重写日志:使用该指令激活它,并控制其详细程度。特别是在更高的日志级别,它可以为您提供非常详细的信息,确切地说明它在做什么。这将使问题从日志中显而易见

此外,如果可能的话,尽量避免在.htaccess文件中配置mod_重写规则——将它们移到主服务器配置文件中。“API阶段”一节解释了原因:

令人难以置信的是,mod_rewrite在每个目录上下文中提供了URL操作,即在.htaccess文件中,尽管这些操作是在URL被转换为文件名后很长一段时间内实现的。必须这样做,因为.htaccess文件位于文件系统中,所以处理已经达到这个阶段。换句话说:根据API的阶段,现在进行任何URL操作都为时已晚。为了克服这个鸡和蛋的问题,mod_rewrite使用了一个技巧:当您在每个目录上下文中操作URL/文件名时,mod_rewrite首先将文件名重写回其相应的URL(这通常是不可能的,但请参阅下面的RewriteBase指令以了解实现此目的的技巧)然后用新的URL发起一个新的内部子请求。这将重新启动API阶段的处理

同样,mod_rewrite努力使这个复杂的步骤对用户完全透明,但您应该记住:虽然每个服务器上下文中的URL操作非常快速和高效,但是每个目录的重写由于鸡和蛋的问题而非常缓慢和低效。但另一方面,这是mod_rewrite向普通用户提供(本地限制的)URL操作的唯一方法


一般来说,完全不使用.htaccess还有一个额外的优势,那就是您可以告诉Apache不要麻烦,同时禁用该功能,这样Apache就不必为.htaccess文件扫描它所服务的每个目录级别。

谢谢您的回答。我对脚本和它生成链接的方式有点困惑(我不是作者),所以我没有想到在不重写的情况下检查那些确切的链接。因此,当我意识到脚本本身可能有问题时,我也检查了一些日志,发现了我以前遗漏的一些东西,PHP错误。在那里,我们调用了不存在的函数,我发现原因是缺少GD库。同样,脚本的作者没有声明正在使用它,所以当我安装它时,一切都按预期工作。
RewriteEngine On
# You must define your installation directory and uncomment the line :
RewriteBase /images/

RewriteRule ^([a-zA-Z]+)\.(jpg|gif|png|wbmp)$ controller/Resizer.php?m=original&a=$1&e=$2 [L]
RewriteRule ^(icon|small|medium|square)\/([a-zA-Z]+)\.(jpg|gif|png|wbmp)$ controller/Resizer.php?m=$1&a=$2&e=$3 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) application.php?request=$1 [L,QSA]
http://106.186.21.176/images/controller/Resizer.php?m=original&a=q&e=png  
http://106.186.21.176/images/controller/Resizer.php?m=small&a=q&e=png