Nginx Laravel 4 url查询重写


Nginx Laravel 4 url query rewrite

我正试图让nginx拦截一个类似这样的url:

http://website.dev/results?livesearch=bill+clinton

并显示为:

http://website.dev/results/bill-clinton

我使用Laravel作为我的PHP框架。当我手动输入url(http://website.dev/results/bill-clinton)时,我会得到正确的页面。

我想做的是让用户在文本输入字段中键入名称;一旦他们点击提交,我希望url显示为http://website.dev/results/bill-clinton,而不是http://website.dev/results?livesearch=bill+clinton

我试着在网上四处寻找帮助,但没有成功。

下面是我的nginx虚拟服务器。

server {
    listen       80;
    server_name  website.dev;
    access_log  logs/host.access.log  main;
    error_log   logs/host.error.log;
    rewrite_log     on;
    root   /path/to/www;
    index  index.php;
    #error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
    location / {
        # Pretty URLs. Allows removal of "index.php" from the URL.
        # Useful for frameworks like Laravel or WordPress.
        try_files $uri $uri/ /index.php?$query_string;
    }
    # Added cache headers for images, quick fix for cloudfront.
    location ~* '.(png|jpg|jpeg|gif)$ {
        expires 30d;
        log_not_found off;
    }
    # Only 3 hours on CSS/JS to allow me to roll out fixes during
    # early weeks.
    location ~* '.(js|css|ico)$ {
        expires 3h;
        log_not_found off;
    }
    # Turn off logging for favicon and robots.txt
    location = /robots.txt      { access_log off; log_not_found off; }
    location = /favicon.ico    { access_log off; log_not_found off; }   
    # Removes trailing slashes (prevents SEO duplicate content issues)
    if (!-d $request_filename)
    {
        rewrite ^/(.+)/$ /$1 permanent;
    }
    # Removes trailing "index" from all controllers.
    # Useful for frameworks like Laravel.
    if ($request_uri ~* index/?$)
    {
        rewrite ^/(.*)/index/?$ /$1 permanent;
    }
    # Unless the request is for a valid file (image, js, css, etc.), 
    # send it to index.php
    if (!-e $request_filename)
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }
    location ~ '.php$ {
        include                         fastcgi.conf;
        fastcgi_split_path_info         ^(.+'.php)(/.+)$;
        fastcgi_pass                    127.0.0.1:9000;
        fastcgi_index                   index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    location ~ /'.ht {
       deny  all;
    }
}

Regex和if=几乎在nginx中总是坏的

nginx中几乎所有的regex重写都会严重影响性能。

对于漂亮URL的初始路由,您实际上可以使用以下内容:

location / {
         try_files $uri $uri/ /index.php?$query_string;
}

Laravel足够聪明,可以在$_SERVER["PATH_INFO"]中查看。它还处理尾随斜杠。

路由

然后,你可以像这样对你计划进行的搜索进行路由:

Route::any("/results/{search?}", "Search@results"); // ? = optional

这个符号是Class@method。它不是静止的。

app/controllers/Search.php中,您会有以下内容:

<?php
class Search extends BaseController {
    public function results($search = null) {
        if (!$search) {
            if (Input::has("q")) {
                // This is where you'd do SEO cleanup to remove special chars.
                return Redirect::to("/results/" . Input::get("q"));
            }
        } else {
            // do stuff with the $search variable here
        }
    }
}

当你在nginx中进行重写时,你实际上无论如何都会重定向用户。(经由301、302或308重定向)。

您可以使用javascript避免这个额外的请求(在提交时将浏览器发送到/request/search-term),并且您可以保存相当多的请求,而不会影响使用noscript浏览的人的体验。