如何移动 .htaccess rules/content 到虚拟主机?
How to move .htaccess rules/content to virtualhost?
我正在尝试将 .htaccess 文件中的 rules/content 移动到虚拟主机(我的 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 [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 文件的内容粘贴到 <Location /> </Location>
内的虚拟主机 file/directive 中吗?
2. <IfModule mod_rewrite.c>
和<IfModule mod_mime.c>
用在<IfModule mod_ssl.c>
里面。我们可以这样使用它还是我有什么错误?
当我检查网站时(在重新启动 Apache 服务器之后),网站加载没有任何问题,但我想确保我没有做错任何事。
提前致谢!
- can we directly paste the contents of .htaccess file into the virtualhost file/directive inside
<Location /> </Location>
不在 <Location>
块内。虽然这在这种情况下可能“有效”,但它并未得到官方支持,并且其他指令可能会中断(匹配的 URL 是绝对文件路径,而不是根相对路径 URL-path - 所以第一个 RewriteRule
实际上并没有做任何事情,因为它永远不会匹配)。
但是,您可以直接将 .htaccess
文件的内容粘贴到适当的 <Directory>
块中。并同时禁用 .htaccess
覆盖 - 否则任何 .htaccess
文件将覆盖服务器配置中的 <Directory>
!
<IfModule mod_rewrite.c>
and <IfModule mod_mime.c>
are used inside <IfModule mod_ssl.c>
. Can we use it like this
可以,但是没有必要。这些 <IfModule>
包装应被删除。这是你的服务器,你知道这些模块是否启用。
# BEGIN
/ # END
注释标记仅在 .htaccess
中严格相关,因为 WordPress 查找这些标记以自动更新 .htaccess
文件。
例如,改为这样(替换 <Location />
块):
<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>
在您的 <VirtualHost>
中,您实际上并未允许访问(即 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
上将 .*
正则表达式更改为简单的 ^
- 这只是一个更有效的正则表达式,因为我们不需要实际匹配任何东西在这里。)
备选方案 - 直接在 <VirtualHost>
另一种方法是将指令直接移动到 <VirtualHost>
容器中(而不是在 目录 上下文中)。但是,这需要一些更改,因为指令的处理时间要早得多(在请求映射到文件系统之前),并且匹配(和写入)的 URL-路径现在始终是相对于根目录的(以斜杠开头) ,而不是相对。重写引擎也没有“循环”,除非这是被明确触发的。此 上下文 中不允许 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
服务器变量相同)。
但是,严格来说,您仍然应该有一个 <directory /var/www/example.com>
容器,以便允许访问和禁用 .htaccess
覆盖。
我正在尝试将 .htaccess 文件中的 rules/content 移动到虚拟主机(我的 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 [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 文件的内容粘贴到 <Location /> </Location>
内的虚拟主机 file/directive 中吗?
2. <IfModule mod_rewrite.c>
和<IfModule mod_mime.c>
用在<IfModule mod_ssl.c>
里面。我们可以这样使用它还是我有什么错误?
当我检查网站时(在重新启动 Apache 服务器之后),网站加载没有任何问题,但我想确保我没有做错任何事。
提前致谢!
- can we directly paste the contents of .htaccess file into the virtualhost file/directive inside
<Location /> </Location>
不在 <Location>
块内。虽然这在这种情况下可能“有效”,但它并未得到官方支持,并且其他指令可能会中断(匹配的 URL 是绝对文件路径,而不是根相对路径 URL-path - 所以第一个 RewriteRule
实际上并没有做任何事情,因为它永远不会匹配)。
但是,您可以直接将 .htaccess
文件的内容粘贴到适当的 <Directory>
块中。并同时禁用 .htaccess
覆盖 - 否则任何 .htaccess
文件将覆盖服务器配置中的 <Directory>
!
<IfModule mod_rewrite.c>
and<IfModule mod_mime.c>
are used inside<IfModule mod_ssl.c>
. Can we use it like this
可以,但是没有必要。这些 <IfModule>
包装应被删除。这是你的服务器,你知道这些模块是否启用。
# BEGIN
/ # END
注释标记仅在 .htaccess
中严格相关,因为 WordPress 查找这些标记以自动更新 .htaccess
文件。
例如,改为这样(替换 <Location />
块):
<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>
在您的 <VirtualHost>
中,您实际上并未允许访问(即 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
上将 .*
正则表达式更改为简单的 ^
- 这只是一个更有效的正则表达式,因为我们不需要实际匹配任何东西在这里。)
备选方案 - 直接在 <VirtualHost>
另一种方法是将指令直接移动到 <VirtualHost>
容器中(而不是在 目录 上下文中)。但是,这需要一些更改,因为指令的处理时间要早得多(在请求映射到文件系统之前),并且匹配(和写入)的 URL-路径现在始终是相对于根目录的(以斜杠开头) ,而不是相对。重写引擎也没有“循环”,除非这是被明确触发的。此 上下文 中不允许 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
服务器变量相同)。
但是,严格来说,您仍然应该有一个 <directory /var/www/example.com>
容器,以便允许访问和禁用 .htaccess
覆盖。