1

I have nginx proxying to apache as a backend in order for nginx to handle static assets. Unfortunately when I attempt to visit a "pretty url" it just displays the index page.

nginx config

server {
        listen   80;

        root /var/www/example.com;
        index index.php index.html index.htm;

        server_name example.com www.example.com a.example.com b.example.com c.example.com;

        location / {
                try_files $uri $uri/ /index.php;
        }

        location ~ \.php$ {

                proxy_set_header X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $host;
                proxy_pass http://127.0.0.1:8080;
        }

         location ~ /\.ht {
                deny all;
        }
}

Apache vhost config

<VirtualHost 127.0.0.1:8080>
        ServerName example.com
        ServerAlias www.example.com
        ServerAlias a.example.com
        ServerAlias b.example.com
        ServerAlias c.example.com

        ServerAdmin [email protected]
        DocumentRoot /var/www/example.com

        <Directory /var/www/example.com>
                AllowOverride All
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/5r_error.log
        CustomLog ${APACHE_LOG_DIR}/5r_access.log combined
</VirtualHost>

.htaccess

RewriteEngine on

RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
RewriteCond %{REQUEST_FILENAME} !/maintenance.html
RewriteRule ^.*$ /maintenance.html [L]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%2://%1%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} ^example-old.co.uk [NC,OR]
RewriteCond %{HTTP_HOST} ^www.example-old.co.uk [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301,NC]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

RewriteRule ^servers/([^\/]+)/?$ servers.php?scroll-to-server=$1 [L,QSA]
RewriteRule ^media/([0-9]+)$ media.php?media-id=$1 [L,QSA]
RewriteRule ^media/([a-z,]+)$ media.php?filter=$1 [L,QSA]
RewriteRule ^manage/?([^\/]+)$ admin.php?page=$1 [L,QSA]
RewriteRule ^operations/?([^/]*)(.*)$ operations.php?c=$1&m=$2 [L,QSA]

ErrorDocument 404 /error
ErrorDocument 403 /error

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]

When I visit example.com it loads fine, when I visit example.com/test it just shows the homepage still. The request in chrome for the page returns 200.

1 Answer 1

2

Your try_files changes the URL to /index.php in order to send it upstream which looses the pretty permalink.

You might try to send the pretty permalink upstream by adding a named location. Maybe:

location / {
    try_files $uri $uri/ @proxy;
}

location @proxy {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8080;
}
location ~ \.php$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8080;
}

See this and this for details.

4
  • After changing to this apache/nginx started serving the page up for download (php source was being downloaded).
    – Titan
    Feb 12, 2016 at 11:14
  • @GreenGiant Understood. I have updated the answer with two proxy locations. Feb 12, 2016 at 11:35
  • Thanks for your solution!!! Just spend hours trying to figure out what I was doing wrong before i found this entry.
    – bleenders
    Mar 5, 2018 at 14:05
  • How about getting this to work with HTTPS?
    – Proximo
    Sep 15, 2019 at 19:23

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .