如何将 .htaccess 规则/内容移动到虚拟主机?

Posted

技术标签:

【中文标题】如何将 .htaccess 规则/内容移动到虚拟主机?【英文标题】:How to move .htaccess rules/content to virtualhost? 【发布时间】:2021-12-06 08:37:36 【问题描述】:

我正在尝试将 .htaccess 文件中的规则/内容移动到虚拟主机(我的 WordPress 网站的文件)。

服务器详情 - Apache 2.4 on Ubuntu 20.04.3 LTS

这是我移动 .htaccess 文件的内容后虚拟主机文件的样子 -

<IfModule mod_ssl.c>
<VirtualHost *:443>
Protocols h2 http/1.1
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/example.com
    ErrorLog $APACHE_LOG_DIR/error.log
    CustomLog $APACHE_LOG_DIR/access.log combined

RewriteEngine on
RewriteCond %HTTP_HOST ^www.example.com [NC]
RewriteRule ^(.*)$ https://example.com$1 [L,R=permanent,NC]

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

<Location />
# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# BEGIN Imagify: webp file type
<IfModule mod_mime.c>
        AddType image/webp .webp
</IfModule>
# END Imagify: webp file type
</Location>


</VirtualHost>
</IfModule>

我的查询:-

1. 这样做是否正确?我的意思是,我们可以直接将.htaccess文件的内容粘贴到&lt;Location /&gt; &lt;/Location&gt;里面的virtualhost文件/指令中吗?

2. &lt;IfModule mod_rewrite.c&gt;&lt;IfModule mod_mime.c&gt; &lt;IfModule mod_ssl.c&gt; 内部使用。我们可以这样使用它还是我犯了什么错误?

当我检查网站时(重新启动 Apache 服务器后),网站加载没有任何问题,但我想确保我没有做错任何事情。

提前致谢!

【问题讨论】:

请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 @Community 这个问题很好!? 【参考方案1】:
    我们可以直接将.htaccess文件的内容粘贴到&lt;Location /&gt; &lt;/Location&gt;里面的virtualhost文件/指令中吗?

不在&lt;Location&gt; 块内。虽然在这种情况下这可能“有效”,但它不受官方支持,并且其他指令可能会中断(匹配的 URL 是绝对文件路径,而不是根相对 URL 路径 - 所以第一个 RewriteRule 实际上没有做任何事情,因为它从不匹配)。

但是,您可以将.htaccess 文件的内容直接粘贴到适当的&lt;Directory&gt; 块中。同时禁用 .htaccess 覆盖 - 否则任何 .htaccess 文件将覆盖服务器配置中的 &lt;Directory&gt;

    &lt;IfModule mod_rewrite.c&gt;&lt;IfModule mod_mime.c&gt;&lt;IfModule mod_ssl.c&gt; 内部使用。我们可以这样使用吗

您可以,但是应该没有必要。这些 &lt;IfModule&gt; 包装应该被删除。这是你的服务器,你知道这些模块是否启用。

# BEGIN / # END 注释标记仅在 .htaccess 中严格相关,因为 WordPress 会查找这些标记以自动更新 .htaccess 文件。

例如,改为这样(替换 &lt;Location /&gt; 块):

<Directory /var/www/example.com>
    Require all granted

    # Disable .htaccess overrides
    AllowOverride None

    # BEGIN WordPress
    RewriteEngine On
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule . /index.php [L]
    # END WordPress

    # BEGIN Imagify: webp file type
    AddType image/webp .webp
    # END Imagify: webp file type
</Directory>

在您的&lt;VirtualHost&gt; 中,您实际上不允许访问(即Require all granted) - 我已在此处添加此内容。但我认为必须在某处的父配置中启用此功能才能正常工作?

旁白:我不知道为什么 WordPress 会写这样的指令,但这里没有使用 RewriteBase 指令(应该完全删除 IMO)。最后一个RewriteRule substitution 上的斜杠前缀也可以被移除(这使得代码更加可移植)。

例如:

# BEGIN WordPress
RewriteEngine On
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]

RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . index.php [L]
# END WordPress

(我还将第一个 RewriteRule 上的 .* 正则表达式更改为简单的 ^ - 这只是一个更有效的正则表达式,因为我们不需要在此处实际匹配任何内容。)


替代方案——直接在&lt;VirtualHost&gt;

另一种方法是将指令直接移动到&lt;VirtualHost&gt; 容器中(而不是在目录 上下文中)。但是,这需要一些更改,因为指令处理得更早(在请求映射到文件系统之前),并且匹配(和写入)的 URL 路径现在始终是根相对的(以斜杠开头),而不是相对。重写引擎也没有“循环”,除非这是明确触发的。在这个 context 中不允许使用 RewriteBase 指令(并导致错误)。

例如:

# BEGIN WordPress
RewriteEngine On
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]

RewriteCond %LA-U:REQUEST_FILENAME !-f
RewriteCond %LA-U:REQUEST_FILENAME !-d
RewriteRule ^/. /index.php [L]
# END WordPress

# BEGIN Imagify: webp file type
AddType image/webp .webp

LA-U: 前缀创建一个前瞻,以确定REQUEST_FILENAME 变量的最终值(否则这与REQUEST_URI 服务器变量相同)。

但是,严格来说,您仍然应该有一个 &lt;directory /var/www/example.com&gt; 容器,以便允许访问和禁用 .htaccess 覆盖。

【讨论】:

感谢详细的回复!这对我有用,我现在禁用了.htaccess。再次感谢您的帮助,祝您有美好的一天:)

以上是关于如何将 .htaccess 规则/内容移动到虚拟主机?的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 规则在本地主机上不起作用

除了我在 htaccess 中的第一条规则之外,我如何重写所有内容?

使用.htaccess将所有子文件夹的目录重定向到Root(主)目录

htaccess编写规则

这些 .htaccess 规则是从哪里来的,它们到底是做啥的?

Htaccess 规则将域重定向到 index.html