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