<div dir="ltr">Hello,​<br><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jun 18, 2013 at 3:22 PM, Ben Johnson <span dir="ltr"><<a href="mailto:ben@indietorrent.org" target="_blank">ben@indietorrent.org</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
Brand new to nginx and loving it so far. Thanks to all who contribute to<br>
the project.<br>
<br>
The try_files directive is brilliant. The only problem I'm having is<br>
that I would like to be able to force a trailing-slash, a la "rewrite",<br>
on the fallback URL.<br>
<br>
The try_files documentation at<br>
<a href="http://wiki.nginx.org/NginxHttpCoreModule#try_files" target="_blank">http://wiki.nginx.org/NginxHttpCoreModule#try_files</a> states that<br>
something like this is usually sufficient (and it is):<br></blockquote><div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">​<br></div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">

I would recommend the original documentation:<br><a href="http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files">http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files</a><br>​</div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


<br>
# for Drupal 6 or 7:<br>
try_files $uri $uri/ /index.php?q=$uri&$args;<br>
<br>
This works well, but I have a need to eliminate duplicate URLs (for SEO<br>
["duplicate-content penalty"] reasons) by forcing a trailing slash on<br>
all virtual URLs (that is, URLs that do not point to a real file or<br>
directory).<br>
<br>
Am I missing something obvious?<br></blockquote><div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">​<div class="gmail_default" style="font-size:small;color:rgb(51,51,153)">If I am correct, the last parameter of the try_files directive handles error situations. It is used when every rule before failed.<br>

</div>If you use:<br>try_files​</div> <div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">​ $uri $uri/;<br></div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">

then you have the wanted behavior.<br><br></div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">From what I see of your rules and what I understand from what you wish to do, you have a conflicting expected behavior :<br>

</div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">- Falling back to index.php?q=$uri&$args<br></div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">

- Falling back to $uri/<br></div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">You need to choose...<br><br></div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">

You'll also note that try_files context is either server or location, thus you can set up a default rule server-wide and overwrite it for specific locations.<br></div><div class="gmail_default" style="font-size:small;color:rgb(51,51,153);display:inline">

<br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
I was able to cook-up a "working solution", but it will probably bristle<br>
a few peoples' hair:<br>
<br>
---------------------------------------------------------<br>
location / {<br>
    # Because nginx doesn't support compound logical<br>
    # expressions in this context, e.g., "if $a = 1 && $b = 2".<br>
<br>
    set $test "";<br>
<br>
    if (!-d $request_filename) {<br>
        set $test "${test}nd";<br>
    }<br>
<br>
    if (!-f $request_filename) {<br>
        set $test "${test}nf";<br>
    }<br>
<br>
    # The request is NOT for an existing file or directory;<br>
    # It must be for a) a file that doesn't exist, b) a legitimate<br>
    # clean-URL PHP resource.<br>
<br>
    # Even if the request is for a legitimate clean-URL PHP resource, we<br>
    # always force a trailing slash.<br>
<br>
    if ($request_filename !~ "/$") {<br>
        set $test "${test}nts";<br>
    }<br>
<br>
    # Not a directory, not a file, and doesn't contain a trailing<br>
    # slash; we need to redirect and append the slash.<br>
<br>
    if ($test = 'ndnfnts') {<br>
        rewrite ^(.*[^/])$ $1/ permanent;<br>
        break;<br>
    }<br>
<br>
    # Not a directory and not a file, but contains a trailing slash;<br>
    # we're done, and we can rewrite the URL per our<br>
    # Controller Pattern logic.<br>
<br>
    if ($test = 'ndnf') {<br>
        rewrite  ^(.*)$  /index.php?q=$1  last;<br>
    }<br>
}<br>
---------------------------------------------------------<br>
<br>
Ultimately, I'm wondering if there's a means by which to achieve the<br>
above with try_files, and if not, if there's a better means than what<br>
I've employed on my own.<br>
<br>
A related "problem" (more an inconvenience, really) is that using<br>
try_files in the manner described in the cited documentation causes the<br>
trailing ampersand ("&") to be appended to "q" even when there are no<br>
$args. Is this behavior intentional? Maybe there's an RFC of which I"m<br>
unaware that lead to this decision.<br>
<br>
Thanks for any help!<br>
<br>
-Ben<br>
<br>
_______________________________________________<br>
nginx mailing list<br>
<a href="mailto:nginx@nginx.org">nginx@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx</a><br>
</blockquote></div><br><font size="1"><span style="color:rgb(102,102,102)">---<br></span><b><span style="color:rgb(102,102,102)">B. R.</span></b><span style="color:rgb(102,102,102)"></span></font>

</div></div></div></div>