2017-02-24 9 views
1

私は短いリンクサービス(goo.glなど)を開発しました。ショートリンクサービスのためのNginxの設定:ファイルでない場合に書き直し

example.com/Lg1Qとして表示されているアドレスバーのブラウザで

Shortlinksは最近、私が原因パフォーマンス上の利点に、nginxのにライティから移行しました。 Lighttpdので 私はURLからのindex.phpスクリプトに「Lg1Q」の部分を引き渡すために

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

を使用しました。

次のようにindex.phpスクリプトはURLからではないファイルの部分を処理します。

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 

私は次のようにnginxの構文にLighttpdのから書き換えルールを再構築しようとした:

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

その後、/ etc/nginx/sites-availableのnginxホストコンテナのlocation ~ \.phpブロックとlocation /ブロックにこのルールを挿入しました。

いずれの場合でも、ブラウザは「404」または「500」エラーを表示しました。

私の質問は 「ショートリンク」の目的で書き換えルールを正しく設定するにはどうすればよいですか?

答えて

1

location /ブロックのrewriteは、短いURIだけでなくすべてを書き換えます。 try_filesステートメントを使用して、書き換え操作を修飾することができます。詳細については、this documentを参照してください。例えば

:クエリ文字列コンポーネントはrewriteディレクティブで使用される正規化URIの一部ではないこと

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

注意。詳細については、this documentを参照してください。

あなたが使用することができ、その場合にはfwdパラメータの大手/を受け入れるようにPHPコードを変更する場合は、上記の一層の簡素化することができます

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

上記の@リチャードスミスの最初の例は、私のスクリプトのトリックでした。 – kzpm

0

をあなたが書き換えを必要としません、

location ~ \.php$ { 
     ... 
} 

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

正規表現の場所と見なされる*正規化されたURI *に '?'とクエリ文字列はありません。シーケンス '(\?。*)? 'は冗長です。 –

+0

これは間違いなく、特定の部分は不要です(私の回答を更新しました)。 – danielgpm

関連する問題