前段时间我开发了一个短链接服务(如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”错误。
我的问题是: 如何正确设置“短链接”目的的重写规则?
答案 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;
}