title: 404 url not found error for flask app on apache2
body: <p>I wrote an endpoint with Flask to handle http post request data in json format. When trying to deploy it on apache2, post requests got 404 error: "The requested URL /bridge was not found on this server" . I'm using python 3.5.2, apache 2.4, OpenSSL/1.0.2g, ubuntu 16.04, mod_wsgi4.3.0 compiled for python 3.5.1+ </p>
  
  <p>Anyone has any idea? Apache cannot see /var/www but why? or there is a problem in SSL configuration? (https works for the webiste) </p>
  
  <p>I have </p>
  
  <p>at /var/www/bridge/bridge.wsgi </p>
  
  <pre><code>#!/usr/bin/python3
  import sys
  
  sys.path.insert(0,'/var/www/bridge')
  
  from bridge import app as application
  </code></pre>
  
  <p>conf file at /etc/apache2/sites-enabled/bridge.conf</p>
  
  <pre><code>&lt;VirtualHost *:443&gt;
  ServerName www.newocto.org
  
  WSGIDaemonProcess bridge user=www-data group=www-data threads=5  home=/var/www/bridge/
  WSGIScriptAlias /bridge /var/www/bridge/bridge.wsgi
  
  &lt;Directory /var/www/bridge&gt;
      WSGIProcessGroup bridge
      WSGIApplicationGroup %{GLOBAL}
  
  
      Require all granted
  &lt;/Directory&gt;
  </code></pre>
  
  <p></p>
  
  <p>my 000-default.conf file is like this:</p>
  
  <pre><code>&lt;VirtualHost *:443&gt;
  # 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.newocto.org
  DocumentRoot /var/www/html
  
  SSLEngine on
  SSLCertificateFile /etc/ssl/certs/newocto_org.crt
  SSLCertificateKeyFile /etc/ssl/private/newocto.key
  SSLCertificateChainFile /etc/ssl/certs/COMODORSAAddTrustCA.crt
  RewriteEngine On
  RewriteCond %{HTTPS} off
  RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
  
  # 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
  &lt;/VirtualHost&gt;
  
  &lt;VirtualHost *:80&gt;
  ServerName  newocto.org/
  Redirect / https://newocto.org/
  &lt;/VirtualHost&gt;
  
  # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
  </code></pre>
  
  <p>and my flask code at /var/www/bridge/bridge.py is </p>
  
  <pre><code>#!/usr/bin/python3
  
  from flask import Flask
  
  
  app = Flask(__name__)
  
  @app.route('/', methods =['POST'])
  def deliver():
      from flask import request
      raw=request.get_json(force=True)
      return raw
  
  import mysql.connector
  dbconn=  mysql.connector.connect(host='xxxx',port='3306',database='xx',user='root',password='xxx')
  cursor=dbconn.cursor()
  query="""insert into bridge_test2 (email) values ('{}')""".format(raw)
  cursor.execute(query)
  dbconn.commit()
  dbconn.close()
  
  
  if __name__ == '__main__':
      app.run()
  
  
  
  #file permissions are like this:   
  #4 -rwxr-xr-x 1 root www-data 537 Dec 20 13:46 bridge.py
  #4 -rwxr-xr-x 1 root www-data 117 Dec 20 14:10 bridge.wsgi
  </code></pre>