Apache-2.4

將 Wordpress .htaccess 程式碼添加到 Apache 配置(適用於所有站點)

  • September 29, 2020

WordPress的預設.htaccess程式碼是:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

如何將程式碼插入 Apache 配置以避免使用.htaccess?我需要將程式碼應用於伺服器上的所有外掛域(伺服器上的所有域都執行 WordPress)。

此外,WordPress 建議添加此程式碼:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

雖然我不確定是否需要它,因為當我刪除它並嘗試載入這些頁面時,他們還是去了 404。

我的目標是完全擺脫.htaccess文件以加快我網站的載入速度。

Apache 2.4+/CentOS

我需要將程式碼應用於伺服器上的所有外掛域

如何配置這取決於您是否<VirtualHost>為每個外掛域有一個單獨的 (vHost),或者您是否為所有外掛域都有一個 vHost。

<VirtualHost>每個外掛域分開

這裡有兩個選項。您可以從伺服器配置繼承通用 (WordPress) 指令,也可以在每個 vHost 中包含一個通用配置文件。

從伺服器配置繼承

如果您的“外掛域”是從單獨的<VirtualHost>容器提供的,那麼您可以將這些“通用”mod_rewrite 指令放在主伺服器配置中(在 vHost 之外)並啟用 mod_rewrite 繼承。

但請注意,在伺服器(或虛擬主機)上下文中,這些指令需要稍作更改。例如:

RewriteEngine On

# Enable all (child) vhost configs to inherit these directives
# (Requires Apache 2.4.8+)
RewriteOptions InheritDown

RewriteRule ^/index\.php$ - [L]
RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteRule ^/. /index.php [L]

更改說明:

  • 刪除(在伺服器上下文中RewriteBase無效)
  • 使用前瞻 ( LA-U:) 檢索請求映射到的文件名。
  • 匹配的 URL 路徑和替換字元串都是根相關的,並以斜杠開頭。
  • <IfModule>不需要包裝器。
# Enable all (child) vhost configs to inherit these directives
# (Requires Apache 2.4.8+)
RewriteOptions InheritDown

如前所述,這需要 Apache 2.4.8 或更高版本。重寫引擎仍然需要在子 vHost 配置中啟用。這些指令(在伺服器配置中)本質上是在 vHost 容器中的任何現有指令之後就地複制的。(WordPress 前端控制器通常需要在其他指令之後。)

如果您不在 Apache 2.4.8+ 上,那麼您需要在所有vHost 配置中包含以下內容,以便繼承父配置。

# Inherit mod_rewrite directives from the server config after the current directives
RewriteOptions Inherit

RewriteOptions Inherit在所有子配置(容器)中與在父配置<VirtualHost>中指定的相同。RewriteOptions InheritDown

更新: Include附加配置文件

除了使用上面提到的 mod_rewrite 繼承,您可以簡單Include地在每個 vHost 容器的適當位置使用通用(WordPress)配置文件。

這也將允許您保留.htaccess文件中的原始指令並將這些原樣包含在相關<Directory>容器中。(而不是直接在 vHost 容器或主伺服器配置中使用它們。)

例如,如果您的原始.htaccess文件的內容在 config (include) 文件/etc/apache2/sites-enabled/wordpress.conf中。然後在您的 vHost 容器中:

DocumentRoot /var/www/example.com/public_html

<Directory /var/www/example.com/public_html>
   AllowOverride None
   Require all granted
   Include /etc/apache2/sites-enabled/wordpress.conf
</Directory>

.htaccess伺服器配置中的和<Directory>容器都是“目錄”上下文,因此指令不會改變。


一個<VirtualHost>適用於所有外掛域

或者,如果您的所有“外掛域”都來自同一個<VirtualHost>容器(或者甚至全部來自伺服器配置直接 - 沒有 vHosts - 儘管我認為 vHosts 更容易管理),那麼上面的 mod_rewrite 程式碼塊(為伺服器配置修改) 將直接進入 vHost 容器(或使用容器.htaccess內的原始指令<Diretcory>)。不需要RewriteOptions指令 - 不需要 mod_rewrite繼承

但是,這需要額外的指令來將每個外掛域的請求路由到適當的 WordPress 安裝目錄。通過以下任一方式:

  • 使用 mod_rewrite 在內部將請求重寫到適當的子目錄或文件系統路徑。但請注意,所有網站都有相同的DocumentRoot. 您可能需要額外的指令來防止直接訪問“外掛”子目錄。您可能需要明確“更正” WordPress 使用的 DOCUMENT_ROOT。
  • 或者,VirtualDocumentRoot根據請求的域使用 (mod_vhost_alias) 將請求路由到適當的子目錄。這將創建一個動態DocumentRoot。

例如,使用 mod_vhost_alias:

<VirtualHost *:443>
   UseCanonicalName Off
   ServerAlias www.*.com
   VirtualDocumentRoot /var/www/%2+/public_html
   <Directory /var/www/*/public_html>
       AllowOverride None
       Require all granted
       Include /etc/apache2/sites-enabled/wordpress.conf
   </Directory>

   # SSL config etc. ...

</VirtualHost>

DocumentRoot/var/www/example.com/public_html(或任何請求的主機名,減去www前綴)。這樣做的好處是可以通過簡單地創建一個新的子目錄來添加新站點,不需要更改伺服器配置,因此不需要重新啟動伺服器。

如果您的所有 WordPress 站點都需要相同的配置,這將更合適。如果某些網站需要特定的定制,那麼實施起來可能會變得更加複雜或“棘手”。但是,在這種情況下,您可以創建另一個/單獨的 vHost。

這也可能需要額外的/不同的步驟來稍後分離不同域的訪問/錯誤日誌。(儘管如果您託管許多單獨的虛擬主機,您可能需要做這樣的事情。)

參考:

https ://httpd.apache.org/docs/2.4/vhosts/mass.html https://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html


如果您不再使用,.htaccess則需要確保完全禁用.htaccessvHost 中的覆蓋以獲得全部好處。IE:

<Directory /var/www>
   AllowOverride None
</Directory>

否則,Apache 仍然會浪費時間搜尋文件.htaccess

引用自:https://serverfault.com/questions/1034190