Nginx

Nginx 重寫以從文件中刪除 .php 無效,但重定向到首頁

  • March 4, 2016

我正在嘗試重寫以從我的 URL 中刪除 .php,但到目前為止還沒有運氣。這是我到目前為止所得到的,然後是下面這個配置的結果。

location ~ \.php$ {
 try_files $uri/ @extensionless-php;
 include fastcgi_params;
 fastcgi_pass hhvm;
 fastcgi_cache_bypass $skip_cache;
 fastcgi_no_cache $skip_cache;
 fastcgi_cache ASPS;
fastcgi_cache_valid 200 60m;
}

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

這將導致:

example.com/page1.php 轉到 example.com/page1.php 並正確渲染 example.com/page1 渲染 index.php example.com/page1/ 渲染 index.php

有沒有人遇到過這個?這似乎是一件很常見的事情,但我遇到了幾個小時的麻煩,並且在網上無休止地搜尋。

謝謝你的幫助!

您的location ~ \.php$塊看不到 URI,example.com/page1因為它們與正則表達式不匹配。

你應該把你的try_files $uri/ @extensionless-php;指令放到一個不同的位置——通常是(它會看到除了以 結尾的location /所有 URI )。.php

嘗試這樣的事情:

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

location ~ \.php$ {
   if ($request_uri ~ (.*)\.php$) { 
       return 301 $1; 
   }

   try_files $uri =404;

   include fastcgi_params;
   fastcgi_pass hhvm;
   fastcgi_cache_bypass $skip_cache;
   fastcgi_no_cache $skip_cache;
   fastcgi_cache ASPS;
   fastcgi_cache_valid 200 60m;
}

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

編輯:為了從以 結尾的 URL 中刪除擴展.php,該location ~ \.php$塊需要將外部呈現的 URL 與內部重寫區分開來。實現此目的的一種方法是$request_uri使用if塊進行測試。謹慎使用,因為外部重寫.phpURL 可能會破壞某些應用程序,尤其是在 POST 表單時。

引用自:https://serverfault.com/questions/761627