短链接服务的Nginx配置:如果不是文件

时间:2017-02-24 21:51:05

标签: php nginx url-rewriting

前段时间我开发了一个短链接服务(如goo.gl)。

浏览器地址栏中的短链接显示为example.com/Lg1Q

最近,由于性能优势,我从Lighty迁移到了Nginx。 在Lighttpd中,我使用了

url.rewrite-if-not-file = (
    "^/(.*)(\?.*)?$" => "/index.php?fwd=$1"
)

将URL中的“Lg1Q”部分移交给index.php脚本。

index.php脚本处理URL中的not-file-part,如下所示:

if ( !empty( $myUrl ) && $_SERVER['REQUEST_URI'] !== '/index.php' && $_SERVER['REQUEST_URI'] !== '/index.html' && $_SERVER['REQUEST_URI'] !$

        $query = htmlspecialchars( str_replace("fwd=","", $_SERVER['QUERY_STRING']) );
        require_once 'src/clsForwardURL.class.php';
        $myForward = new clsForwardURL();
        $url = $myForward->fForwardURL( $query );
        $url = ( $url[0]['su_longurl'] );
        echo header( 'location:'.$url );


}//end if

我尝试将重写规则从Lighttpd重建为Nginx语法,如:

rewrite "^/(.*)(\?.*)?$" /index.php?fwd=$1;

之后,我随后在location ~ \.php块和/ etc / nginx / sites-available中的nginx主机容器的location /块中插入了此规则。

不幸的是,在这两种情况下,浏览器都显示“404”或“500”错误。

我的问题是: 如何正确设置“短链接”目的的重写规则?

2 个答案:

答案 0 :(得分:1)

rewrite块中的location /将重写所有内容 - 而不仅仅是您的短URI。您可以使用try_files语句限定重写操作。有关详情,请参阅this document

例如:

location / {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    rewrite ^/(.*)$ /index.php?fwd=$1 last;
}

请注意,查询字符串组件不是rewrite指令使用的规范化URI的一部分。有关详情,请参阅this document

如果修改PHP代码以接受/参数中的前导fwd,则可以进一步简化上述内容,在这种情况下,您可以使用:

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

答案 1 :(得分:0)

您不需要重写,整个捕获逻辑可以位于根位置本身,例如:

location ~ \.php$ {
      ...
}

# using a name variable instead of $1
location ~ ^/(?<short_url>.*)$ {
   try_files $uri $uri/ /index.php?fwd=$short_url;
}