我正在尝试将.htaccess文件中的规则/内容移动到virtualhost(我的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文件的内容粘贴到<Location /> </Location>
内部的virtualhost文件/指令中吗?
2。<IfModule mod_rewrite.c>
和<IfModule mod_mime.c>
用于<IfModule mod_ssl.c>
内部。我们可以这样使用它吗?或者我犯了什么错误吗?
当我检查网站时(在重新启动Apache服务器后),网站加载没有任何问题,但我想确保我没有做错任何事情。
提前感谢!
- 我们可以直接将.htaccess文件的内容粘贴到
<Location /> </Location>
内的virtualhost文件/指令中吗
不在<Location>
块内。虽然这可以";工作;在这种情况下,它不受官方支持,其他指令可能会中断(匹配的URL是绝对文件路径,而不是根相对URL路径——所以第一个RewriteRule
实际上没有做任何事情,因为它永远不会匹配)。
但是,可以直接将.htaccess
文件的内容粘贴到适当的<Directory>
块中。同时禁用.htaccess
覆盖-否则任何.htaccess
文件都将覆盖服务器配置中的<Directory>
!
<IfModule mod_rewrite.c>
和<IfModule mod_mime.c>
用于<IfModule mod_ssl.c>
内部。我们可以这样用吗
但是,您可以不需要这样做。应该删除这些<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
替换上的斜杠前缀也可以被删除(这使代码更易于移植)。
例如:
# 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
覆盖。