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

<pre><code>    try_files $uri $uri/ /index.php?$query_string;
</code></pre>

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

<p>You can see this works by hitting a random <code>.php</code> url on my site: <a href="https://nystudio107.com/woof.php" rel="nofollow noreferrer">https://nystudio107.com/woof.php</a></p>

<p>c.f.: <a href="https://github.com/nystudio107/nginx-craft/blob/master/sites-available/somedomain.com.conf#L106" rel="nofollow noreferrer">https://github.com/nystudio107/nginx-craft/blob/master/sites-available/somedomain.com.conf#L106</a> &amp; <a href="https://github.com/nystudio107/nginx-craft" rel="nofollow noreferrer">Nginx-Craft</a></p>

CC BY-SA 3.0
2017-09-22T20:10:33.627Z
Looks like `/woof.php` still returns a 404! Would like to see `/woof/` instead. Thanks for your answer though, your plugins are amazing!
Clark Nelson
CC BY-SA 3.0
2017-09-22T20:15:51.937Z
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.
andrew.welch
CC BY-SA 3.0
2017-09-22T20:19:47.227Z
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.
andrew.welch
CC BY-SA 3.0
2017-09-20T00:25:27.247Z
2017-09-20T00:25:27.247Z
andrew.welch
<p>I ended up writing php files in the public directory to redirect users:</p>

<p><strong>public/gallery.php</strong></p>

<pre><code>&lt;?php
if($_SERVER['QUERY_STRING']){
    parse_str($_SERVER['QUERY_STRING']);
    if($q){
        header("Location: https://".$_SERVER['SERVER_NAME']."/?filter=".$q);
        die();
    } else {
        header("Location: https://".$_SERVER['SERVER_NAME']."/");
        die();
    }
}
?&gt;
</code></pre>

CC BY-SA 3.0
2017-09-22T20:16:42.920Z
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.
andrew.welch
CC BY-SA 3.0
2017-09-22T20:14:19.200Z
2017-09-22T20:14:19.200Z
Clark Nelson
<p>I'm running into a few issues trying to set up 301/302 redirects with Craft and nginx. The legacy site has <code>/contact.php</code> paths which I would like to direct to <code>/info/</code> but when I visit <code>mysite.com/contact.php</code> it gives me the <code>No input file specified.</code> error.</p>

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

<p>Below is my nginx file for reference:</p>

<pre><code>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;
}
</code></pre>

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

<p>Thanks for your help!</p>

<nginx>
Redirects with Craft and nginx
# Redirects with Craft and nginx

(Asked by: username_0 on 2017-09-15)

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!

**Tags:** nginx

---

## 2 answers

### Answer by username_1 on 2017-09-20. Score: 2 | Accepted answer

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

> **Comments:**
> **username_0**: Looks like `/woof.php` still returns a 404! Would like to see `/woof/` instead. Thanks for your answer though, your plugins are amazing!  
> **username_1**: 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.  
> **username_1**: 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.  

---

### Answer by username_0 on 2017-09-22. Score: 0

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

> **Comments:**
> **username_1**: 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.  

---

