每个附加域单独

每个附加域单独

.htaccessWordPress 的默认代码是:

<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

答案1

我需要将代码应用于服务器上的所有附加域

如何配置取决于<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(无效服务器语境)
  • 使用 lookahead( 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文件的内容在配置(包含)文件中/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>容器提供服务(甚至全部由服务器配置直接提供服务 - 没有 vHost - 虽然我认为 vHost 更易于管理),则上述 mod_rewrite 代码块(针对服务器配置进行了修改)将直接进入 vHost 容器(或使用容器.htaccess内的原始指令<Diretcory>)。无需RewriteOptions指令 - 没有 mod_rewrite遗产必需的。

但是,这需要额外的指令来将每个插件域的请求路由到适当的 WordPress 安装目录。通过以下任一方式:

  • 使用 mod_rewrite 在内部将请求重写到适当的子目录或文件系统路径。但请注意,所有站点都具有相同的DocumentRoot。您可能需要其他指令来阻止直接访问“addon”子目录。您可能需要明确“更正”WordPress 使用的 DOCUMENT_ROOT。

  • 或者,VirtualDocumentRoot根据请求的域使用 (mod_vhost_alias) 将请求路由到适当的子目录。这将创建一个动态的文档根目录。

例如,使用 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。

这也可能需要额外的/不同的步骤来稍后分离不同域的访问/错误日志。(尽管如果您托管许多单独的 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 中的覆盖以获得全部好处。即:

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

否则,Apache 仍然会浪费时间搜索用于.htaccess文件。

相关内容