I'm running into a few issues trying to set up 301/302 redirects with Craft and nginx. The legacy site has /contact.php paths which I would like to direct to /info/ but when I visit mysite.com/contact.php it gives me the No input file specified. error.

I tried setting this up with Retour plugin, and inside of nginx files, but they both return No input file since there is no contact.php on my server.

Below is my nginx file for reference:

server {
    listen 80;
    listen 443 ssl http2;
    server_name mysite.com;
    root "/home/vagrant/mysite/public";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/mysite.error.log error;

    sendfile off;

    client_max_body_size 100m;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;

    location ~ /\.ht {
        deny all;

    ssl_certificate     /etc/nginx/ssl/mysite.crt;
    ssl_certificate_key /etc/nginx/ssl/mysite.key;

I know Craft is doing some weird things here to avoid index.php, not sure how it affects my situation though. In addition to mapping /contact.php to /info/, I would also like to make /gallery.php?c=category to /?filter=category

Thanks for your help!

2 Answers 2


To fix the "No Input File" in your Nginx config, you'll need something like this inside if your php location handler:

    try_files $uri $uri/ /index.php?$query_string;

That will cause it to run the query through Craft (via index.php) if the .php file doesn't exist, which then allows Retour to handle it.

You can see this works by hitting a random .php url on my site: https://nystudio107.com/woof.php

c.f.: https://github.com/nystudio107/nginx-craft/blob/master/sites-available/somedomain.com.conf#L106 & Nginx-Craft

  • Looks like /woof.php still returns a 404! Would like to see /woof/ instead. Thanks for your answer though, your plugins are amazing! Commented Sep 22, 2017 at 20:10
  • Yes, it could easily redirect if I set it up in Retour to do so. This was just showing that it is a Craft 404 (as evidenced by the custom 404 not found page). Once you make the change to the Nginx config that I mentioned, you then simply add the redirect you want via Retour. Commented Sep 22, 2017 at 20:15
  • In case I wasn't clear, the fundamental problem you're having is that your Nginx config doesn't allow files ending in .php to be routed through Craft if there is a 404 (because your .php location handler doesn't pass them off to Craft at last resort). This is what prevents Retour (or any other such plugin) from working with .php files. Commented Sep 22, 2017 at 20:19

I ended up writing php files in the public directory to redirect users:


        header("Location: https://".$_SERVER['SERVER_NAME']."/?filter=".$q);
    } else {
        header("Location: https://".$_SERVER['SERVER_NAME']."/");
  • I would recommend doing it the way I noted, as it bottlenecks your 404 redirects, and allows you to add as many new ones as you need to without having to create new .php files to do so. Commented Sep 22, 2017 at 20:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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