1

私たちのユーザー (Facebook のような) のための「個人用 URL」を作成できるようにしたいと思います。これはもちろん動的文字列です。それはサイトのルートにある必要があり、それが私がそれで大きな頭痛を抱えている理由です.

私が持っている要件は次のとおりです。

1. www.example.com/John.Doe が必要です (a-zA-Z0-9_- の場合もあります)。

それを次のように書き換えます。

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;
}
4

1 に答える 1

0

拡張子のないスクリプトと個人用 URL の名前空間が重複しているため、$uri.phpファイルを に書き換える前にファイルの存在をテストする必要がありますprofile.php

そのため、最初のディレクティブで URI を書き直すtry_files(現在のように) よりも、名前付きロケーション ブロックを使用して、最初に書き直すことなく 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 ファイルを処理します (存在する場合のみ)。profile.php3 番目のブロックは、 (クライアントに公開されないため、拡張子なしである必要はありません)への書き換えを実行します。4 番目のブロックは、通常の.phpURI を処理し、$request_uri修正を含めます。

fastcgi_indexは、この構成と元の構成の両方で冗長であることに注意してください。

詳細については、 locationtry_files、およびrewriteディレクティブのnginxドキュメントへのリンクをいくつか示します。

于 2016-07-12T10:42:50.397 に答える