將 Wordpress .htaccess 程式碼添加到 Apache 配置(適用於所有站點)
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
則需要確保完全禁用.htaccess
vHost 中的覆蓋以獲得全部好處。IE:<Directory /var/www> AllowOverride None </Directory>
否則,Apache 仍然會浪費時間搜尋文件
.htaccess
。