2015-07-19 4 views
3

Я пытаюсь заставить Nginx обрабатывать файлы php без расширения (т. Е. Обрабатывать http://localhost/sample так же, как и обрабатывать http://localhost/sample.php).Nginx & Обработка файлов без расширения

Это мой сайт конфигурации:

server { 
    listen 80 default_server; 
    listen [::]:80 default_server ipv6only=on; 

    server_name localhost; 

    root /var/www; 
    index index.html index.php; 

    location ~ \.(hh|php)$ { 
     fastcgi_keep_conn on; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 

    location/{ 
     try_files $uri $uri/ $uri.html @extensionless =404; 
    } 

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

Насколько я знаю, что это следует сделать трюк. Однако - нет. Попытка http://localhost/sample просто заводит меня на 404 страницу (тогда как http://localhost/sample.php отлично работает).

При включении отладки, я вижу следующее в журналах:

2015/07/19 15:37:00 [debug] 4783#0: *1 http script var: "/sample" 
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use file: "/sample" "/var/www/sample" 
2015/07/19 15:37:00 [debug] 4783#0: *1 http script var: "/sample" 
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use dir: "/sample" "/var/www/sample" 
2015/07/19 15:37:00 [debug] 4783#0: *1 http script var: "/sample" 
2015/07/19 15:37:00 [debug] 4783#0: *1 http script copy: ".html" 
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use file: "/sample.html" "/var/www/sample.html" 
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use file: "@extensionless" "/var/[email protected]" 
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use file: "=404" "/var/www=404" 

Что странно. Это в основном выглядит как @extensionless рассматривается как простое имя файла (вместо места, ведущего к переписыванию URL-адреса).

Что мне не хватает? :) Спасибо!

ответ

3
try_files $uri $uri/ $uri.html @extensionless =404; 

Да, @extensionless обрабатывается как обычный файл, и это потому, что вы добавили дополнительный =404 после @extensionless в try_files - часть @extensionless будет работать только как последний параметр как внутренняя переадресация в другой контекст.

Если вы хотите не только поддерживать запросы вручая без .php, а также лишить .php от каких-либо запросов, вы можете сделать следующее:

location/{ 
    if (-e $request_filename.php){ 
     rewrite ^/(.*)$ /$1.php; 
    } 
} 
location ~ \.php$ { 
    if ($request_uri ~ ^/([^?]*)\.php(\?.*)?$) { 
     return 302 /$1$2; 
    } 
    fastcgi_... 
} 
+0

Связанный: http://stackoverflow.com/a/32966140/1122270 – cnst

+0

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/Лучше не использовать IF и REWRITE , Также лучше сделать 301 переадресацию вместо 302 в этом случае (браузер запомнит это). Посмотрите альтернативный ответ ниже. –

+0

@ Юджин Захаренко, вы ошибаетесь на обоих счетах. Что действительно зло - это 301 переадресация, потому что, как вы указываете, они кэшируются браузером; что вы опускаете, так это то, что они кэшируются навсегда, что приводит к различным видам поведения. – cnst

7

Просто обновление (на случай, если кто-либо найдет это полезным), что я получил его на работу, в конце концов.

Это конфигурация, сделал трюк:

server { 
    listen 80; 

    root /var/www; 
    index index.html index.htm index.php; 

    server_name localhost; 

    location/{ 
     if (!-e $request_filename){ 
      rewrite ^(.*)$ /$1.php; 
     } 
     try_files $uri $uri/ =404; 
    } 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
} 
1

Это гораздо лучше, чтобы избежать использования медленного переписывания и зло, если самым быстрым и простым способом:

location ~ ^(.*)\.php$ # If PHP extension then 301 redirect to semantic URL 
{ 
    return 301 $scheme://$server_name$1$is_args$args; 
} 
location ~ ^/(.*) 
{ 
    try_files $uri.php @static; # If static, serve it in @static 
    include fastcgi_params; # if semantic, serve it here 
    fastcgi_param SCRIPT_FILENAME $document_root/$1.php; 
} 
location @static 
{ 
    try_files $uri =404; 
} 
Смежные вопросы