Собственно понадобилось мне добавить расширение .php для статей WordPress под управлением Webinoly, сделать это, как выяснилось, достаточно просто.
Итак напомню, Webinoly у меня стоит в конфигурации NGINX+PHP-FPM и как выяснилось, NGINX считает что расширение .php у статей — это прям вообще ненужное дело, и даже вредное, и всячески сопротивляется, но…
Действие первое. Админка
Итак для начала убедимся, что просто так ничего не работает — для этого идем в админке WordPress в [highlight] Настройки[/highlight] > [highlight] Постоянные ссылки[/highlight] и вводим в поле [highlight] Произвольно[/highlight] значение [highlight] /%postname%.php[/highlight], сохраняем, и… На сайте ничего не работает — все статьи ведут на 404.
Ну что же, ставим плагин [highlight] .PHP on PAGES[/highlight] (не обязательно его, выбор тут достаточно большой — гугл в помощь).
И все также ничего не работает. Но мы этого ожидали и лезем ковырять конфиг (предупреждаю, возможно есть более изящные решения, буду рад если вы предложите своё).
Действие второе. Конфиги
Для этого лезем на сервер (я использую WinSCP) в папку [highlight] /etc/nginx/sites-available[/highlight] и редактируем конфиг нужного сайта. Комментируем строку include common/wpfc.conf; поставив перед ней #.
# include common/wpfc.conf; include common/wpcommon.conf; include common/locations.conf; include common/headers-http.conf; include common/headers-html.conf;
А затем вставляем содержимое файла wpfc.conf; перед этим блоком (после строки index index.php index.html index.htm;).
# WPFC NGINX CONFIGURATION # DO NOT MODIFY, ALL CHANGES LOST AFTER UPDATE Webinoly set $skip_cache 0; # POST requests and URL with a query string should always go to php if ($request_method = POST) { set $skip_cache 1; } if ($query_string != "") { set $skip_cache 1; } # Don't cache URL containing the following segments if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*.php|index.php|/feed/|.*sitemap.*\.xml)") { set $skip_cache 1; } # Don't use the cache for logged in users or recent commenter or customer with items in cart if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|[a-z0-9]+_items_in_cart|[a-z0-9]+_cart_hash") { set $skip_cache 1; } # Use cached or actual file if they exists, Otherwise pass request to WordPress location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_pass php; fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache WORDPRESS; }
И заменяем в нем выделенную строку try_files $uri =404; на try_files $uri /index.php?$args; получаем в итоге:
# WebinolyNginxServerStart server { listen 80; listen [::]:80; server_name yoursite.ru www.yoursite.ru; access_log /var/log/nginx/yoursite.ru.access.log we_log; error_log /var/log/nginx/yoursite.ru.error.log; root /var/www/yoursite.ru/htdocs; index index.php index.html index.htm; # WPFC NGINX CONFIGURATION # DO NOT MODIFY, ALL CHANGES LOST AFTER UPDATE Webinoly set $skip_cache 0; # POST requests and URL with a query string should always go to php if ($request_method = POST) { set $skip_cache 1; } if ($query_string != "") { set $skip_cache 1; } # Don't cache URL containing the following segments if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*.php|index.php|/feed/|.*sitemap.*\.xml)") { set $skip_cache 1; } # Don't use the cache for logged in users or recent commenter or customer with items in cart if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|[a-z0-9]+_items_in_cart|[a-z0-9]+_cart_hash") { set $skip_cache 1; } # Use cached or actual file if they exists, Otherwise pass request to WordPress location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { try_files $uri /index.php?$args; include fastcgi_params; fastcgi_pass php; fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache WORDPRESS; } # include common/wpfc.conf; include common/wpcommon.conf; include common/locations.conf; include common/headers-http.conf; include common/headers-html.conf; include /var/www/yoursite.ru/*-nginx.conf; } # WebinolyNginxServerEnd
Естественно необходимо поменять [highlight] yoursite.ru[/highlight] на имя вашего сайта.
Проверяем правильность конфига и перезагружаем NGINX введя в консоли:
user@server:~# sudo nginx -t user@server:~# sudo service nginx restart
Итак проверяем что расширение .php для статей теперь добавляется и работает нормально. В результате этих манипуляций мы получим работающий сайт все материалы которого будут иметь адрес вида [highlight] yoursite.ru/my-cool-post.php[/highlight]