我正在尝试在OSX上使用Apache2配置mod_mono。我想在同一个虚拟主机上运行多个MVC3项目,但由于某种原因,只有列出的第一个项目正在运行。对此有任何帮助将非常感激,因为没有太多关于此的文档。我尝试了很多不同的配置选项,但似乎都没有。
Listen *:9005
<VirtualHost *:9005>
DocumentRoot "/Library/WebServer/vhosts/api"
ServerName api
MonoAutoApplication disabled
Alias /gamecenter "/Library/WebServer/vhosts/api/gamecenter"
AddMonoApplications gamecenter "/gamecenter:/Library/WebServer/vhosts/api/gamecenter"
MonoServerPath gamecenter "/usr/bin/mod-mono-server4"
MonoDebug gamecenter true
MonoSetEnv gamecenter MONO_IOMAP=all
MonoUnixSocket gamecenter-stage /tmp/mod_mono_server_gc
<Location /gamecenter>
Allow from all
Order allow,deny
MonoSetServerAlias gamecenter
SetHandler mono
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary
</Location>
Alias /gamecenter-stage "/Library/WebServer/vhosts/api/gamecenter-stage"
MonoServerPath gamecenter-stage "/usr/bin/mod-mono-server4"
MonoDebug gamecenter-stage true
MonoSetEnv gamecenter-stage MONO_IOMAP=all
AddMonoApplications gamecenter-stage "/gamecenter-stage:/Library/WebServer/vhosts/api/gamecenter-stage"
MonoUnixSocket gamecenter-stage /tmp/mod_mono_server_gcs
<Location /gamecenter-stage>
Allow from all
Order allow,deny
MonoSetServerAlias gamecenter-stage
SetHandler mono
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary
</Location>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript
</IfModule>
</VirtualHost>
答案 0 :(得分:3)
你的问题是你的别名和物理路径是一样的,所以apache不知道要提供哪一个。
注意:我根据一般的Apache2配置给出答案,而不是mod_mono,也许mod_mono做了一些事情来防止这种情况,我没有在之前的* nix框下设置MVC应用程序: - )
总之...
如果你看一下你的路径配置......
/Library/WebServer/vhosts/api
/Library/WebServer/vhosts/api/gamecenter
/Library/WebServer/vhosts/api/gamecenter-stage
如果没有您的别名,这些已经解析为您尝试映射的路径。
/Library/WebServer/vhosts/api = /
/Library/WebServer/vhosts/api/gamecenter = /gamecenter
/Library/WebServer/vhosts/api/gamecenter-stage = /gamecenter-stage
你告诉Apache那个
/ = /
/gamecenter = /gamecenter
/gamecenter-stage = /gamecenter-stage
当Apache尝试传递内容时,如果没有文件子修正或现有斜线(如在最后2中),它将自动,使用/修改文件夹然后发出重定向(我相信306)基本上告诉浏览器从EG重定向:
/gamecenter to /gamecenter/
使用别名告诉它Alias ...位于x位置然后必须尝试做出决定
/gamecenter/
或
/gamecenter/gamecenter/../ (Because in terms of folder structure the alias name is 1 folder level down in the web than it is physically)
并最终变得混乱,当无法解析路径时,任何虚拟主机设置所做的事情也是如此,并且返回网站根目录。
虽然我是SAY,但这是一般的NON-MONO Apache行为,mod_mono可能会以某种方式改变处理管道,这可能会改变这种行为。
我建议将其拆分为3个虚拟主机,即使只使用一个IP,也可以轻松完成。
你要做的第一件事是你的主Apache配置文件中的somwhere,有一个
Listen 9005
语句。这将使所有虚拟实例侦听该端口以及任何其他已配置的端口EG:80
接下来确保您拥有默认捕获所有虚拟主机,这将捕获未映射到其他位置的任何服务器名称:
<VirtualHost *>
DocumentRoot "/some/folder/where/the/default/is/"
#Followed by other server directives. NOTE: there is NO servername line
</VirtualHost>
完成设置后,转到“api”子域
<VirtualHost *>
ServerName api
DocumentRoot "/Library/WebServer/vhosts/api/"
#Other required directives here
</VirtualHost>
此时,我将暂停讨论您的域名。如果这是一个内部测试系统(我怀疑它是这样),那么如果你在你的盒子上安装DNS服务器,那么你会发现虚拟域的生活更容易,然后使用私有内部网络地址将其设置为主域。
EG:
创建根区域,并将其命名为“mydevnetwork.local”
然后为其添加机器名称:
EG:如果您的电脑名为devpc1,请为“devpc1.mydevnetwork.local”创建一个IP地址,并为您的电脑提供EG的静态IP地址:192.168.50.1
然后为此设置别名
api.mydevnetwork.local = devpc1.mydevnetwork.local
我没有足够的空间在这里发布完整的DNS设置帖子,但希望你能得到这个想法。
一旦设置了DNS(或至少是主机文件条目),Apache下的虚拟主机就变得非常容易管理:
<VirtualHost *>
ServerName api.mydevnetwork.local
DocumentRoot "/Library/WebServer/vhosts/api/"
#Other required directives here
</VirtualHost>
如果您需要,也很容易重新定位到另一台机器。
您可以以相同的方式设置其余虚拟主机
<VirtualHost *>
ServerName gamecenter.mydevnetwork.local
DocumentRoot "/Library/WebServer/vhosts/api/gamecenter/"
#Other required directives here
</VirtualHost>
<VirtualHost *>
ServerName gamecenter-stage.mydevnetwork.local
DocumentRoot "/Library/WebServer/vhosts/api/gamecenter-stage/"
#Other required directives here
</VirtualHost>
注意iv'设置路径与上面的路径相同,即使这样可行,我强烈建议你给每个人自己独特的文件夹,我通常会这样做:
wwwroot
api.mydevnetwork.local
htdocs <-- Web files go here
cgi-bin <-- cgi scripts go here and it's mapped to /cgi-bin/
logs <-- logs here
access <-- htpasswd files here
希望如果上述内容不是一个完整的解决方案,你至少可以从中得到一些进一步的调查意见。