web-dev-qa-db-ja.com

NGINXを使用してURLから.phpと.html拡張子の両方を削除するにはどうすればよいですか?

私はnginxにすべてのURLをきれいに表示させたいです。

いくつかの研究で、私は最初のケースを作成しました。これは、次の構成によって行われます。

location / {
    root   html;
    index  index.html index.htm index.php;
    try_files $uri.html $uri/ =404; 
}

Indexhtmlとして表示されるindexhtml.htmlには機能しますが、.phpでは何も起こりません。 $ uri.htmlを$ uri.phpに変更すると、.htmlでも.phpでも機能しません。私はPHPの場所に似たようなものを入れようとしましたが、成功しませんでした。

何かアドバイスはありますか?

39
anthropophagus

私が調査したものから、/ etc/nginx/conf.d/domain.tld.confファイルを追加して含める場合:

location / {
    try_files $uri $uri.html $uri/ @extensionless-php;
    index index.html index.htm index.php;
}

location ~ \.php$ {
    try_files $uri =404;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php last;
}

次に、nginxを再起動して試してください。これがお役に立てば幸いです!より多くの情報を見つけることができます(私が見つけたところ) ここで@ tweaktalk.net

44
Jack

余分なブロックや名前付きの場所などは必要ありません。 index行も移動します ロケーションブロックの外側

server {
  index index.html index.php;
  location / {
    try_files $uri $uri/ $uri.html $uri.php$is_args$query_string;
  }
  location ~ \.php$ {
    try_files $uri =404;
    # add fastcgi_pass line here, depending if you use socket or port
  }
}

/folder/xyz//folder/xyz.phpのように、同じフォルダー内に同じ名前のフォルダーとファイルがある場合、フォルダーxyzにはindex.phpまたはindex.htmlが含まれますが、これに留意してください。

46

さらに Mohammadの答え にするには、.htmlおよび.phpから拡張機能なしのバージョンへのリダイレクトを提供することもできます。

これは、 $request_uri に「完全な元のリクエストURI(引数付き)」が含まれ、ユーザーに表示されない内部書き換えの影響を受けないという事実により実現できます。

server {
  index index.html index.php;
  location / {
    if ($request_uri ~ ^/(.*)\.html$) {  return 302 /$1;  }
    try_files $uri $uri/ $uri.html $uri.php?$args;
  }
  location ~ \.php$ {
    if ($request_uri ~ ^/([^?]*)\.php($|\?)) {  return 302 /$1?$args;  }
    try_files $uri =404;
    # add fastcgi_pass line here, depending if you use socket or port
  }
}
8
cnst

おそらくこれはあなたのために役立つかもしれません...それは簡単で、仕事を終わらせます:

location / {
  rewrite ^/([^\.]+)$ /$1.html break;
}
1