2016-07-12 2 views
1

私は私たちのユーザー(Facebookのような)のために「個人的なURL」を作ることができたいと思います。それはサイトのルートにある必要があり、それが私がそれに大きな頭痛を感じている理由です。私がしているしているNginxが「個人用URL」を作成するために書き直す

要件:

1.私は(それが-ZA-Z0-9_-することができます。) www.example.com/John.Doeが必要

とそれを書き換える:

www.example.com/profile?id=John.Doe

2.は私もトンと私が行うことができた以下のような拡張機能(、するサイトのスクリプトが必要使用して、ここで彼は偉大な人々、 "$ uri.php $ is_args $ QUERY_STRINGを;"):

ので www.example.com/login に行くだろう。 www.example.com/login.php

私はたくさんのことを試しましたが、うまくいくような正しい数式を得ることができません。 これは今、私の設定です:

location/{ 
    try_files $uri $uri/ $uri.php$is_args$query_string; 
} 

location ~ \.php$ { 
    if ($request_uri ~ ^/([^?]*)\.php(\?.*)?$) { 
     return 301 /$1$2; 
    } 
    try_files $uri =404; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9001; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
} 

答えて

0

はあなたの拡張レススクリプトとあなたの個人的なURLの重複の名前空間を持っているので、あなたはprofile.phpにそれを書き換える前に、$uri.phpファイルの存在をテストする必要があります。

最初のtry_filesディレクティブのURIを書き換えるのではなく、名前付きのロケーションブロックを使用して、PHPファイルを最初に書き直すことなく処理する方がよい場合があります。

location/{ 
    try_files $uri $uri/ @php; 
} 

location @php { 
    try_files $uri.php @rewrite; 

    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9001; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
} 

location @rewrite { 
    rewrite ^/([a-zA-Z0-9_.-]+)$ /profile.php?id=$1 last; 
} 

location ~ \.php$ { 
    if ($request_uri ...) { ... } 

    try_files $uri =404; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9001; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
} 

最初のブロックは静的ファイルを提供しています:このように

。 2番目のブロックは、拡張機能のないPHPファイルを処理します(存在する場合に限り)。 3番目のブロックは、profile.php(クライアントに公開されていないため、拡張機能を必要としない)への書き換えを実行します。 4番目のブロックは通常の.phpのURIを処理し、$request_uriの修正が含まれています。

fastcgi_indexは、これと元の設定の両方で重複しています。

は、詳細については、こちらをlocationtry_filesrewriteディレクティブnginxドキュメントへのリンクです。

+0

ありがとうございました!、素晴らしい仕事をしました。私はここで新しい人なので投票できません。 – Trocker

+0

ようこそSO :-)私は私の答えにいくつかの参考文献を追加しました。 –

関連する問題