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 info@example.com
        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

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.

  • After changing to this apache/nginx started serving the page up for download (php source was being downloaded). – Titan Feb 12 '16 at 11:14
  • @GreenGiant Understood. I have updated the answer with two proxy locations. – Richard Smith Feb 12 '16 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 '18 at 14:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.