在服务器配置/VirtualHost中使用时不应用RewriteRule



我有一个运行在Ubuntu 20.04上的apache2 web服务器。

我有许多域都重定向到位于/var/www/mydomain.com的一个网站。我启用了SSL,目前使用每个域的配置文件中的"重写"规则强制从所有HTTP重新路由到HTTPS。

我的目标是让mydomain.com/schedule重新路由到mydomain.com/index.html?=/schedule。我尝试将以下两行添加到000-default.confmydomain.com.confmydomain.com-le-ssl.conf中,每次更改后,我都会重新启动整个服务器。它不起作用,我在mydomain.com/schedule得了404分。

我误解了什么?以下是目前存在的相关文件。

mydomain.com-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin me@mydomain.com
ServerName mydomain.com
DocumentRoot /var/www/mydomain.com/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/ge0rges.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ge0rges.com/privkey.pem

RewriteEngine on
RewriteRule ^schedule$ index.html?=/schedule [NC]
</VirtualHost>
</IfModule>

mydomain.com.conf

<VirtualHost *:80>
ServerAdmin me@mydomain.com
ServerName mydomain.com
DocumentRoot /var/www/mydomain.com/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

RewriteEngine on
RewriteCond %{SERVER_NAME} =mydomain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

000-default.conf

<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

default-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on
#   A self-signed (snakeoil) certificate can be created by installing
#   the ssl-cert package. See
#   /usr/share/doc/apache2/README.Debian.gz for more info.
#   If both key and certificate are stored in the same file, only the
#   SSLCertificateFile directive is needed.
SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
#   Server Certificate Chain:
#   Point SSLCertificateChainFile at a file containing the
#   concatenation of PEM encoded CA certificates which form the
#   certificate chain for the server certificate. Alternatively
#   the referenced file can be the same as SSLCertificateFile
#   when the CA certificates are directly appended to the server
#   certificate for convinience.
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt
#   Certificate Authority (CA):
#   Set the CA certificate verification path where to find CA
#   certificates for client authentication or alternatively one
#   huge file containing all of them (file must be PEM encoded)
#   Note: Inside SSLCACertificatePath you need hash symlinks
#        to point to the certificate files. Use the provided
#        Makefile to update the hash symlinks after changes.
#SSLCACertificatePath /etc/ssl/certs/
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt
#   Certificate Revocation Lists (CRL):
#   Set the CA revocation path where to find CA CRLs for client
#   authentication or alternatively one huge file containing all
#   of them (file must be PEM encoded)
#   Note: Inside SSLCARevocationPath you need hash symlinks
#        to point to the certificate files. Use the provided
#        Makefile to update the hash symlinks after changes.
#SSLCARevocationPath /etc/apache2/ssl.crl/
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl
#   Client Authentication (Type):
#   Client certificate verification type and depth.  Types are
#   none, optional, require and optional_no_ca.  Depth is a
#   number which specifies how deeply to verify the certificate
#   issuer chain before deciding the certificate is not valid.
#SSLVerifyClient require
#SSLVerifyDepth  10
#   SSL Engine Options:
#   Set various options for the SSL engine.
#   o FakeBasicAuth:
#    Translate the client X.509 into a Basic Authorisation.  This means that
#    the standard Auth/DBMAuth methods can be used for access control.  The
#    user name is the `one line' version of the client's X.509 certificate.
#    Note that no password is obtained from the user. Every entry in the user
#    file needs this password: `xxj31ZMTZzkVA'.
#   o ExportCertData:
#    This exports two additional environment variables: SSL_CLIENT_CERT and
#    SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
#    server (always existing) and the client (only existing when client
#    authentication is used). This can be used to import the certificates
#    into CGI scripts.
#   o StdEnvVars:
#    This exports the standard SSL/TLS related `SSL_*' environment variables.
#    Per default this exportation is switched off for performance reasons,
#    because the extraction step is an expensive operation and is usually
#    useless for serving static content. So one usually enables the
#    exportation for CGI and SSI requests only.
#   o OptRenegotiate:
#    This enables optimized SSL connection renegotiation handling when SSL
#    directives are used in per-directory context.
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
<FilesMatch ".(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
#   SSL Protocol Adjustments:
#   The safe and default but still SSL/TLS standard compliant shutdown
#   approach is that mod_ssl sends the close notify alert but doesn't wait for
#   the close notify alert from client. When you need a different shutdown
#   approach you can use one of the following variables:
#   o ssl-unclean-shutdown:
#    This forces an unclean shutdown when the connection is closed, i.e. no
#    SSL close notify alert is send or allowed to received.  This violates
#    the SSL/TLS standard but is needed for some brain-dead browsers. Use
#    this when you receive I/O errors because of the standard approach where
#    mod_ssl sends the close notify alert.
#   o ssl-accurate-shutdown:
#    This forces an accurate shutdown when the connection is closed, i.e. a
#    SSL close notify alert is send and mod_ssl waits for the close notify
#    alert of the client. This is 100% SSL/TLS standard compliant, but in
#    practice often causes hanging connections with brain-dead browsers. Use
#    this only for browsers where you know that their SSL implementation
#    works correctly.
#   Notice: Most problems of broken clients are also related to the HTTP
#   keep-alive facility, so you usually additionally want to disable
#   keep-alive for those clients, too. Use variable "nokeepalive" for this.
#   Similarly, one has to force some clients to use HTTP/1.0 to workaround
#   their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
#   "force-response-1.0" for this.
# BrowserMatch "MSIE [2-6]" 
#       nokeepalive ssl-unclean-shutdown 
#       downgrade-1.0 force-response-1.0
</VirtualHost>
</IfModule>
RewriteRule ^schedule$ index.html?=/schedule [NC]

服务器虚拟主机上下文(与目录或者.htaccess上下文相反(中,RewriteRule模式匹配的URL路径与完整的根相对URL路径匹配,以斜杠开头。因此,上面的模式(即^schedule$(在这里永远不会匹配,并且该规则不起任何作用。在此上下文中,替换字符串还必须表示根相对路径(以斜杠开头(。

请尝试以下操作:

RewriteRule ^/schedule$ /index.html?=/schedule [NC,L]

(旁白:?=/schedule是一个不寻常的查询字符串,因为它缺少一个参数名称?(

或者,使用反向引用来保存重复:

RewriteRule ^/schedule$ /index.html?=$0 [NC,L]

其中$0是包含来自RewriteRule模式的完全匹配的反向引用,即本例中的/schedule

相关内容

  • 没有找到相关文章