# Try\_files php

**URL:** <https://www.ruby-forum.com/t/try-files-php/189273>\
**Category:** NGINX\
**Created:** [May 27, 2010, 8:14pm UTC](https://www.ruby-forum.com/t/try-files-php/189273 "2010-05-27T20:14:57Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 8:14pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/1 "2010-05-27T20:14:57Z")

</div>

How can I reproduce this behavior:

with a request to /foo/bar

try file: foo/bar  
try index.htm: foo/bar/  
try file: foo/bar.htm  
try file: foo/bar.html  
try parse php: foo/bar.php  
try file: /layout.htm  
try file: /layout.html  
try parse php: /layout.php  
return 404 if not found.

I try this:

```
location / {
  try_files $uri $uri/ $uri.htm $uri.html $uri.php layout.htm

```

/layout.html /layout.php;  
}

Everything works, except PHP that returns as text file showing the  
source code.

ps: Is there a blog post that explain exactly how location, if,  
rewrite and try\_files works?  
The docs are not so clear about how the flow works.

Marcos N.

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 8:27pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/2 "2010-05-27T20:27:49Z")

</div>

sounds like you just need a php location? this works like a charm.

server {  
listen 80;  
server\_name [foo.com](http://foo.com);  
index index.php index.html;  
root /home/foo/web/foo.com;  
include /etc/nginx/defaults.conf;  
include /etc/nginx/expires.conf;  
try\_files $uri $uri/ /wordpress/index.php?q=$uri;  
location ~ .php$ {  
fastcgi\_pass 127.0.0.1:11000;  
include /etc/nginx/fastcgi.conf;  
}  
}

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 8:36pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/3 "2010-05-27T20:36:01Z")

</div>

Sorry, I forget to say that php is working.  
I create a file named phpinfo.php  
if I access /phpinfo.php works like always before,  
but if I try /phpinfo it shows the source code.

Marcos N.  
+55 44 9918-8488

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 8:42pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/4 "2010-05-27T20:42:28Z")

</div>

On Fri, May 28, 2010 at 1:35 AM, Marcos N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Sorry, I forget to say that php is working.  
> I create a file named phpinfo.php  
> if I access /phpinfo.php works like always before,  
> but if I try /phpinfo it shows the source code.

because except for the last one in the try\_files, everything are  
processed within the location block (ie no location search).

–  
O\< ascii ribbon campaign - stop html mail - [www.asciiribbon.org](http://www.asciiribbon.org)

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 8:53pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/5 "2010-05-27T20:53:36Z")

</div>

On Thu, May 27, 2010 at 11:13 AM, Marcos N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> try file: /layout.html  
> Everything works, except PHP that returns as text file showing the source code.  
> [mailman.nginx.org archive](http://nginx.org/mailman/listinfo/nginx)

As someone else mentioned it serves the file because that is what you  
asked it to do. You will probably need something more convoluted  
along the following lines, but I don’t guarantee it is correct (to  
whit, I don’t think the try\_files in @second is correct but I copied  
your line):

upstream backend {  
server 127.0.0.1:9000;  
}  
server {  
listen 80;  
server\_name supercomplicatedphpcrap;  
root /path/to/root;

location / {  
try\_files $uri $uri/ $uri.htm $uri.html @first;  
}

location @first {  
include fastcgi\_params;  
fastcgi\_param SCRIPT\_FILENAME $uri.php  
fastcgi\_pass backend;  
fastcgi\_intercept\_errors on;  
error\_page 404 =@second;  
}

location @second {  
try\_files layout.htm /layout.html /layout.php;  
}  
}

– Merlin

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 8:41pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/6 "2010-05-27T20:41:18Z")

</div>

probably because it’s try\_files’ing the uri and putting on .php  
internally but NOT actually considering it originally a .php file? i  
think.

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 9:05pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/7 "2010-05-27T21:05:20Z")

</div>

On Thu, May 27, 2010 at 03:13:32PM -0300, Marcos N. wrote:

> try file: /layout.html  
> Everything works, except PHP that returns as text file showing the source code.
> 
> ps: Is there a blog post that explain exactly how location, if,  
> rewrite and try\_files works?  
> The docs are not so clear about how the flow works.

You can not mix different handlers: static and php, in one try\_files.  
My variant is similar to Merlin’s:

```
 location / {
     try_files $uri $uri/index.htm $uri.htm $uri.html @php;
 }

 location @php1 {
     try_files $uri.php @file1;
     fastcgi_pass ...
 }

 location @file1 {
     try_files /layout.htm /layout.html @php2;
 }

 location @php2 {
     try_files /layout.php =404;
     fastcgi_pass ...
 }

```

–  
Igor S.

> **[Igor Sysoev](http://sysoev.ru/en/)**

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 9:15pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/8 "2010-05-27T21:15:52Z")

</div>

How about this one?

try\_files $uri $uri/ $uri.htm $uri.html @php;

```
location @php {
  rewrite ^.*$ $uri.php;
}

```

Do I need to put try files inside a location / { } ?

Is a good idea use: if (-f $uri.php) {do php handler}

Marcos N.  
+55 44 9918-8488

On Thu, May 27, 2010 at 4:04 PM, Igor S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > try parse php: foo/bar.php  
> > }  
> > location / {  
> > try\_files $uri $uri/index.htm $uri.htm $uri.html @php;  
> > }
> 
> ```
> location @php1 {
> try_files $uri.php @file1;
> 
> ```

the follow lines are always executed or only when the try\_file above  
match $uri.php ?

> ```
> fastcgi_pass ...
> }
> 
> location @file1 {
> try_files /layout.htm /layout.html @php2;
> }
> 
> location @php2 {
> 
> ```

What the =404 below means?

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 9:25pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/9 "2010-05-27T21:25:14Z")

</div>

On Thu, May 27, 2010 at 04:14:38PM -0300, Marcos N. wrote:

> How about this one?
> 
> try\_files $uri $uri/ $uri.htm $uri.html @php;
> 
> ```
> location @php {
> rewrite ^.*$ $uri.php;
> }
> 
> ```

You do not test laytout files here.  
Here is the right configuration:

š š location / {  
š š š š try\_files š$uri $uri/index.htm $uri.htm $uri.html @php;  
š š }

š š location @php1 {  
š š š š try\_files š$uri.php š=404;  
š š š š fastcgi\_pass š…  
š š }

> Do I need to put try files inside a location / { } ?

You should put it in most specific location.

> Is a good idea use: if (-f $uri.php) {do php handler}

No.

> > > with a request to /foo/bar
> > > 
> > > rewrite and try\_files works?  
> > > š š š š try\_files š$uri.php š@file1;  
> > > the follow lines are always executed or only when the try\_file above  
> > > match $uri.php ?

Yes.

> > š š š š fastcgi\_pass š…  
> > š š }
> > 
> > š š location @file1 {  
> > š š š š try\_files š/layout.htm /layout.html @php2;  
> > š š }
> > 
> > š š location @php2 {  
> > What the =404 below means?

return 404 code as the last resort.

> > š š š š try\_files š/layout.php š=404;  
> > š š š š fastcgi\_pass š…  
> > š š }

–  
Igor S.

> **[Igor Sysoev](http://sysoev.ru/en/)**

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 9:36pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/10 "2010-05-27T21:36:57Z")

</div>

If we ignore the layout files, using the rewrite solution is a good one?

Marcos N.  
+55 44 9918-8488

2010/5/27 Igor S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 10:10pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/11 "2010-05-27T22:10:20Z")

</div>

Thanks all for helping.

Marcos N.  
+55 44 9918-8488

2010/5/27 Igor S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![Marcos\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c77e96/32.png) [@Marcos\_N](https://www.ruby-forum.com/u/Marcos_N)\
**Post date:** [May 27, 2010, 9:38pm UTC](https://www.ruby-forum.com/t/try-files-php/189273/12 "2010-05-27T21:38:42Z")

</div>

On Thu, May 27, 2010 at 04:35:56PM -0300, Marcos N. wrote:

> If we ignore the layout files, using the rewrite solution is a good one?

No. A good solution is:

š š location / {  
š š š š try\_files š$uri $uri/index.htm $uri.htm $uri.html @php;  
š š }

š š location @php1 {  
š š š š try\_files š$uri.php š=404;  
š š š š fastcgi\_pass š…  
š š }

–  
Igor S.

> **[Igor Sysoev](http://sysoev.ru/en/)**
