Answers.Body: <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>
  
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2017-09-22T20:10:33.627Z
Answers.Text: Looks like `/woof.php` still returns a 404! Would like to see `/woof/` instead. Thanks for your answer though, your plugins are amazing!
Answers.UserDisplayName: Clark Nelson
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2017-09-22T20:15:51.937Z
Answers.Text: 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.
Answers.UserDisplayName: andrew.welch
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2017-09-22T20:19:47.227Z
Answers.Text: 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.
Answers.UserDisplayName: andrew.welch
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2017-09-20T00:25:27.247Z
Answers.LastActivityDate: 2017-09-20T00:25:27.247Z
Answers.UserDisplayName: andrew.welch
Answers.Body: <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>
  
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2017-09-22T20:16:42.920Z
Answers.Text: 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.
Answers.UserDisplayName: andrew.welch
Answers.ContentLicense: CC BY-SA 3.0
Answers.CreationDate: 2017-09-22T20:14:19.200Z
Answers.LastActivityDate: 2017-09-22T20:14:19.200Z
Answers.UserDisplayName: Clark Nelson
Body: <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>
  
Tags: <nginx>
Title: Redirects with Craft and nginx
ThreadText: # 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](https://github.com/nystudio107/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**
  
  ```
  <?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();
      }
  }
  ?>
  
  ```
  
  > **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.  
  
  ---
  
  