[Apache][WP] 解決: wp-cron.php not found or unable to stat

[Apache][WP] 解決 error_log 中的 [error] [client 127.0.0.1] script ‘…/www/wp-cron.php’ not found or unable to stat 錯誤訊息

如果你一個 Apache web server 服務多個網站的話,而在 “主站” (寫在 …/apache/conf/httpd.conf 中的 DocumentRoot 那個即為主站) 的 error_log 檔案中要是看到上面這個訊息的話,那表示你在此 Apache 服務的網站中至少有一個網站是用 WordPress 架設的,並且它不是上述的 “主站”,而它嘗試要跑 wp-cron.php 時發生了錯誤。

起因:
Apache 嘗試要幫 WordPress 要跑 wp-cron.php 時會呼叫到 hostname 轉 IP 的底層,這時要是 /etc/hosts 檔案中有以下這幾行:

127.0.0.1    localhost localhost.localdomain wp-hostname.yourdomain.com yourdomain.com yourdomain
xxx.xxx.xxx.xxx    wp-hostname.yourdomain.com yourdomain.com yourdomain

其中上面寫在 127.0.0.1 那行的 wp-hostname.yourdomain.com 是造成錯誤的原因。因為底層 hostname 轉 IP 時查 /etc/hosts 會先查到第一行而認為 wp-hostname.yourdomain.com 是 IP = 127.0.0.1,這樣會造成 Apache 以為要跑 wp-cron.php 的是 “主站” (假設這個 “主站” 不是用 WordPress 架設的網站)而去嘗試執行 “主站” 中這個不存在的 wp-cron.php 檔案,後來發現檔案不存在而寫出上面的錯誤訊息到 error_log 中。

解法 1:
將 127.0.0.1 那一行的「wp-hostname.yourdomain.com」刪除,只留下寫在 xxx.xxx.xxx.xxx 那一行即可。也就是上述 /etc/hosts 範例的兩行變成:
127.0.0.1     localhost localhost.localdomain yourdomain.com yourdomain
xxx.xxx.xxx.xxx    wp-hostname.yourdomain.com yourdomain.com yourdomain

解法 2:
有些(系統)工具在跑完以後會幫你在 127.0.0.1 後面加上「wp-hostname.yourdomain.com」,所以上面的解法 1 就不是那麼適用,那就可以嘗試第二個解法。
在 …/apache/conf/httpd.conf 或是 .htaccess 中將 “主站” 接收到的這個 http 需求 “重寫(rewrite)” (假設主站位在 /var/www/html/ 目錄):

<Directory /var/www/html>
RewriteRule wp-cron.php http://wp-hostname.yourdomain.com/wp-cron.php [R=301]
</Directory>

PS: 除非不得已,不要嘗試用 crontab 去每個小時跑 wp-cron.php :p

3 thoughts on “[Apache][WP] 解決: wp-cron.php not found or unable to stat”

  1. 我的WP搬了一次家
    wordpress就找不到wp-cron.php了
    我试着第一种方法可以是我找不到etc/hosts
    请问这个文件夹在哪
    谢谢

  2. /etc/hosts 指的是,當你的作業系統 (OS, Operating System) 是用 Unix 或 Unix like (如: Linux) OS 系統時,你可以在 /etc/ 目錄中找到 hosts 這個檔案。

    如果是 Microsoft 的 Windows OS 系統的話,可能要找找類似以下這個路徑 (但是這一篇寫的基礎是基於 Unix 或 Unix like OS 寫的):
    C:\WINDOWS\system32\drivers\etc\hosts

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.