title: apache virtualhosts configuration problems cause 404 or test page
body: <p>I have a CentOS7 server, and I have deploied WordPress based on Apache2.4.6.
  I used Certbot to deploy my certificate, it required me to open virtualhost *:80, when I finished viturehost configuration, added <code>127.0.0.1       example.com</code> to hosts and got the certificate, my page shows the default Apache test page rather than my home page, and I didn't move any files which in WordPress root directory<code>/var/www/html</code>.
  Here's my httpd.conf file.</p>
  
  <pre><code>&lt;VirtualHost *:80&gt; 
          DocumentRoot "/var/www/html/"       
          ServerName example.com                     
          ServerAlias www.example.com  
          &lt;Directory /var/www/html/&gt;
              Options Indexes FollowSymLinks ExecCGI
              Require all granted
              AllowOverride All
          &lt;/Directory&gt;
          ErrorLog "logs/slg-error.log"
          CustomLog "logs/slg-access.log" common
          RewriteEngine on
          RewriteCond %{SERVER_NAME} =example.com [OR]
          RewriteCond %{SERVER_NAME} =www.example.com
          RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
  &lt;/VirtualHost&gt;
  </code></pre>
  
  <p>Here's .htacess file in WordPress root drectory</p>
  
  <pre><code># BEGIN WordPress
  &lt;IfModule mod_rewrite.c&gt;
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.php$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
  &lt;/IfModule&gt;
  
  # END WordPress
  </code></pre>
  
  <p>Please note that I have enabled allowoverride <code>AllowOverride All</code> and require all <code>Require all granted</code> in file <code>httpd.conf</code>. But here's something wrong in this part: </p>
  
  <pre><code>#
  # Deny access to the entirety of your server's filesystem. You must
  # explicitly permit access to web content directories in other 
  # &lt;Directory&gt; blocks below.
  #
  &lt;Directory /&gt;
      AllowOverride All
      Require all denied
  &lt;/Directory&gt;
  </code></pre>
  
  <p>When I set <code>Require all</code> to <code>denied</code>, it will show the default page, but when I set it to <code>Require all granted</code>, it will show <code>404 NOT FOUND PAGE:The requested URL / was not found on this server.</code> </p>
  
  <p>Here's virtualhost:443</p>
  
  <p>Please note that the Carbot I used to install ertificate is automatic, so I didn't edit the file <code>ssl.conf</code></p>
  
  <pre><code>&lt;VirtualHost _default_:443&gt;
  
  # General setup for the virtual host, inherited from global configuration
  #DocumentRoot "/var/www/html"
  #ServerName www.example.com:443
  
  # Use separate log files for the SSL virtual host; note that LogLevel
  # is not inherited from httpd.conf.
  ErrorLog logs/ssl_error_log
  TransferLog logs/ssl_access_log
  LogLevel warn
  
  #   SSL Engine Switch:
  #   Enable/Disable SSL for this virtual host.
  SSLEngine on
  
  #   SSL Protocol support:
  # List the enable protocol levels with which clients will be able to
  # connect.  Disable SSLv2 access by default:
  SSLProtocol all -SSLv2 -SSLv3
  
  #   SSL Cipher Suite:
  #   List the ciphers that the client is permitted to negotiate.
  #   See the mod_ssl documentation for a complete list.
  SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
  
  #   Speed-optimized SSL Cipher configuration:
  #   If speed is your main concern (on busy HTTPS servers e.g.),
  #   you might want to force clients to specific, performance
  #   optimized ciphers. In this case, prepend those ciphers
  #   to the SSLCipherSuite list, and enable SSLHonorCipherOrder.
  #   Caveat: by giving precedence to RC4-SHA and AES128-SHA
  #   (as in the example below), most connections will no longer
  #   have perfect forward secrecy - if the server's key is
  #   compromised, captures of past or future traffic must be
  #   considered compromised, too.
  #SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5
  #SSLHonorCipherOrder on 
  
  #   Server Certificate:
  # Point SSLCertificateFile at a PEM encoded certificate.  If
  # the certificate is encrypted, then you will be prompted for a
  # pass phrase.  Note that a kill -HUP will prompt again.  A new
  # certificate can be generated using the genkey(1) command.
  SSLCertificateFile /etc/pki/tls/certs/localhost.crt
  
  #   Server Private Key:
  #   If the key is not combined with the certificate, use this
  #   directive to point at the key file.  Keep in mind that if
  #   you've both a RSA and a DSA private key you can configure
  #   both in parallel (to also allow the use of DSA ciphers, etc.)
  SSLCertificateKeyFile /etc/pki/tls/private/localhost.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/pki/tls/certs/server-chain.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)
  #SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
  
  #   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
  
  #   Access Control:
  #   With SSLRequire you can do per-directory access control based
  #   on arbitrary complex boolean expressions containing server
  #   variable checks and other lookup directives.  The syntax is a
  #   mixture between C and Perl.  See the mod_ssl documentation
  #   for more details.
  #&lt;Location /&gt;
  #SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
  #            and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
  #            and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
  #            and %{TIME_WDAY} &gt;= 1 and %{TIME_WDAY} &lt;= 5 \
  #            and %{TIME_HOUR} &gt;= 8 and %{TIME_HOUR} &lt;= 20       ) \
  #           or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
  #&lt;/Location&gt;
  
  #   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 StrictRequire:
  #     This denies access when "SSLRequireSSL" or "SSLRequire" applied even
  #     under a "Satisfy any" situation, i.e. when it applies access is denied
  #     and no other module can change it.
  #   o OptRenegotiate:
  #     This enables optimized SSL connection renegotiation handling when SSL
  #     directives are used in per-directory context. 
  #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
  &lt;Files ~ "\.(cgi|shtml|phtml|php3?)$"&gt;
      SSLOptions +StdEnvVars
  &lt;/Files&gt;
  &lt;Directory "/var/www/cgi-bin"&gt;
      SSLOptions +StdEnvVars
  &lt;/Directory&gt;
  
  #   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-5]" \
           nokeepalive ssl-unclean-shutdown \
           downgrade-1.0 force-response-1.0
  
  #   Per-Server Logging:
  #   The home of a custom SSL log file. Use this when you want a
  #   compact non-error SSL logfile on a virtual host basis.
  CustomLog logs/ssl_request_log \
            "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
  
  &lt;/VirtualHost&gt;    
  </code></pre>
  
  <hr>
  
  <p>Problems resolved.</p>
  
  <p>Here's the Virtualhost:443 I configured.</p>
  
  <hr>
  
  <pre><code>#Listen 443 https
  
  &lt;VirtualHost *:443&gt;
  
  # General setup for the virtual host, inherited from global configuration
  DocumentRoot "/var/www/html"
  ServerName example.com
      &lt;Directory "/var/www/html"&gt;
      allow from all
      AllowOverride all
      Options Indexes FollowSymLinks ExecCGI
      &lt;/Directory&gt;
  ...
  
  &lt;/VirtualHost&gt;     
  </code></pre>
  
  <p>Any help and suggestions will be very appreciated.</p>