Using try_files while forcing a trailing-slash in the URL

B.R. reallfqq-nginx at yahoo.fr
Tue Jun 18 20:17:05 UTC 2013


Hello,​


On Tue, Jun 18, 2013 at 3:22 PM, Ben Johnson <ben at indietorrent.org> wrote:

> Hello,
>
> Brand new to nginx and loving it so far. Thanks to all who contribute to
> the project.
>
> The try_files directive is brilliant. The only problem I'm having is
> that I would like to be able to force a trailing-slash, a la "rewrite",
> on the fallback URL.
>
> The try_files documentation at
> http://wiki.nginx.org/NginxHttpCoreModule#try_files states that
> something like this is usually sufficient (and it is):
>
​
I would recommend the original documentation:
http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
​


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

​ $uri $uri/;
then you have the wanted behavior.

>From what I see of your rules and what I understand from what you wish to
do, you have a conflicting expected behavior :
- Falling back to index.php?q=$uri&$args
- Falling back to $uri/
You need to choose...

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.


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

---
*B. R.*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx/attachments/20130618/4720b19e/attachment.html>


More information about the nginx mailing list