问题描述
我刚刚将我的开发环境从旧机器转移到新 MAC。我喜欢将 MAMP 用于我的一般本地环境(更简单的项目),但出于某种原因,最近版本的 MAMP 希望我将端口 8888 用于我的本地主机。
我将它改回端口 80,这是我在旧机器上的 MAMP 上的端口,并且我有一些绝对的开发链接,所以我不想麻烦地放置 localhost:8888只是在我的 Uri:s
开头的 localhost结果是无法访问任何资源,一切都被禁止。将端口改回 8888,它工作正常。
为什么我会出现这种行为?
一个月前(Can't connect to port 80 in MAMP on MAc)其他人似乎也遇到了同样的问题,但没有解决。
------------------- 更新
lsof -I tcp:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Google 973 mattias 28u IPv6 0x269b774a91275221 0t0 TCP localhost:54383->localhost:http (CLOSE_WAIT)
Google 973 mattias 36u IPv6 0x269b774a91275881 0t0 TCP localhost:54384->localhost:http (CLOSE_WAIT)
httpd 5444 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5445 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5446 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5447 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5448 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5449 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5461 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5468 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5476 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5477 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
httpd 5478 mattias 4u IPv6 0x269b774a912738a1 0t0 TCP *:http (LISTEN)
此外,http://localhost/MAMP/ 工作正常
当我尝试访问 webroot 中我自己的任何文件夹时,我被禁止:
如果我尝试使用一级文件夹(即 http://localhost/myapp/,位于 webroot/myapp),我只会得到
禁止 您无权访问此资源。
但是如果我尝试使用子文件夹或 PHP 文件,例如 http://localhost/myapp/subfolder/ 要么 http://localhost/myapp/subfolder/index.PHP
然后我反而得到
禁止 您无权访问此资源。服务器无法读取htaccess文件,拒绝访问是安全的
如果我将 MAMP 配置为使用不同的端口,则一切正常。但我不想在 dev env 的路由中指定端口,因为我正在开发的应用程序有一些硬编码的 Uri:s。
此外,这是一种让我烦恼的奇怪行为 =) 我的另一个 MAC 没有这样做,所以我想深入了解它...
-------另一个更新
如果它与权限有关,我已将我的 Web 根目录(我相信 MAMP 默认调用它的 htdocs)移动到我的用户文件夹(用户/主页/文档/www)中,但我不明白为什么它可以正常工作在端口 8888 下但不在 80 下......这不像 Apache 根据它运行的端口来访问我的文件夹......
-------请求的信息
我偶尔会启动一个节点服务器只是为了检查一个人的工作,但目前没有运行。当它打开时,它在端口 3000 下运行。
.htaccess 我的 web/ 文件夹: 重写引擎开启 RewriteCond %{HTTP_HOST} ^domain-name.com$ [NC,OR] RewriteCond %{HTTP_HOST} ^www.domain-name.com$ RewriteCond %{REQUEST_URI} !folder/ RewriteRule (.*) /folder/$1 [L]
Mac 版 Big Sur 11.3.1
MAMP 6.3 版
解决方法
发生这种情况是因为还有其他应用程序使用端口 80。我想到的一个是 Skype。您可以尝试 lsof -i tcp:80 以查看哪些进程正在锁定端口 80。
,我已经移动了我的 webroot (htdocs 我相信 MAMP 默认调用它) 进入我的用户文件夹(用户/主页/文档/www),如果它以某种方式 权限相关,但我不明白为什么它可以正常工作 在端口 8888 下但不在 80 下......它不像 Apache 获得访问权限 根据它运行的端口到我的文件夹...
这就是问题所在。我不知道为什么不同端口的行为不同,但是将 wwwroot 设置为 MAMP/htdocs 并将我的应用程序移到那里解决了问题。
我不会将此标记为答案,以防万一有人可以解释为什么 MAMP 在我的主文件夹中获得 wwwroot 的权限,只要它在端口 8080 或其他端口上运行,而在端口 80 上没有权限,这将是这个问题的最佳答案...
,我能想到的原因可能有多种。我还想为每个人提出一个解决方法。
首先,Mac (Darwin) 基于 Linux。这意味着 1024 范围内的端口是特权的。任何在环 3(用户空间)中运行的应用程序都无法访问这些端口。
您需要以 sudo
权限运行应用程序。这当然会带来安全风险,只有在适当考虑后才应该这样做。通常,您不应使用 sudo
运行 Web 服务器(以及 MAMP 等开发环境)。请参阅我最后一点的解决方案,该解决方案通常在许多生产环境中用作最佳实践。
其次,您很有可能尝试以 root 身份运行它,但仍然无法访问该端口。这可能是因为该端口已被另一个应用程序占用。
要检查这一点,您可以发出 lsof -i tcp:80
,我可以看到您无论如何都这样做了。杀死为您阻止此端口的其他应用程序。有时退出应用程序还不够,您可能必须使用sudo kill -9 pid
。此 man page 中有更多信息。
第三,Mac 特定问题可能是(我认为您就是这种情况,因为您在访问 webroot 和子文件夹时会看到不同的错误),要么是看门人阻止 MAMP 访问目录,要么是 {{1} } 权限不正确(因为我看到了 .htaccess 投诉)。
- 首先检查 Mac Gatekeeper
chmod
是否没有阻止应用程序。 - 然后检查是否从
System Preference -> Pivacy & Security -> General
或Full Disk Access
下的Files and Folders
为 MAMP 启用了目录访问 - 最后,您可以递归地对项目目录设置
System Preference -> Pivacy & Security -> Privacy
755 权限,对文件设置 644 权限。chown
。查看此 SupeUser 博文了解更多详情。
最后,如果没有其他工作,您可以在其他端口上运行 MAMP,然后使用 chown -R 755 DIRECTORY
从该端口的端口 80 重定向所有本地流量。如果 Web 服务器没有隐藏在负载均衡器或反向代理之后,那么这也主要是在生产环境中实际配置 Web 服务器的方式。有关说明,请参阅此 AskUbunu 帖子。