У меня есть установка веб-сервера Nginx с PHP, и я хочу перейти на Nginx, и я хочу преобразовать эти правила .htaccess в файл nginx.conf:
RewriteRule ^blog(|/)$ /data/core/site/blog.php
RewriteRule ^blog/post(|/)$ /data/core/site/blogpost.php
Пока вот что у меня есть:
location /blog {
rewrite ^(.*)$ /data/core/blog.php last;
}
Однако, если я захожу на страницу (http://example.com/blog), Он дает мне файл для загрузки, я хочу, чтобы он сервер PHP и отображал контент, как мне это исправить?
Полная конфигурация Nginx: (с использованием пакета Winginx в Windows):
server {
listen 127.0.0.1:80;
server_name localhost;
root home/localhost/public_html;
index index.php;
log_not_found off;
#access_log logs/localhost-access.log;
charset utf-8;
location ~ /\. { deny all; }
location = /favicon.ico { }
location = /robots.txt { }
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9054;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
location /blog {
rewrite ^(.*)$ /data/core/blog.php last;
}
}
Главное правило, которое следует запомнить: nginx обслуживает запрос с одним местоположением (можно выделить еще больше: и только одно место).
Читать: http://nginx.org/en/docs/http/request_processing.html
location
соответствиеЧитать: location
документация
В зависимости от вашей конфигурации nginx сначала будет соответствовать /blog
префикс место, затем на \.php$
регулярное выражение местоположение и в конечном итоге обслужит запрос с последним. С предоставленной вами конфигурацией скрипт больше не должен загружаться как необработанный файл, а должен быть отправлен на PHP.
Однако это не означает, что ваша конфигурация верна: запрос не обслуживается вашим /blog
место, которое на данный момент бесполезно.
fastcgi*
директивы в /blog
расположение? Тогда вместо использования $fastcgi_script_name
переменная (угадывается из location
совпадение, которое будет вариантами /blog
здесь), вы можете использовать fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php
. Кстати, $fastcgi_script_filename
уже содержал стартовый /
, не нужно добавлять единицу между переменнымиrewrite
даже больше. Простые перенаправления пользователей (переписывание URL-адресов посредством уведомлений о перенаправлении, отправленных клиенту с кодами состояния HTTP) могут быть выполнены с помощью return
. То, что вы здесь сделали, было внутренним перенаправлением (выполнялось локально на сервере): его единственное использование заключалось в изменении URI, который затем использовался для SCRIPT_FILENAME
параметр.Для начала можно использовать:
location /blog {
fastcgi_pass 127.0.0.1:9054;
fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php;
include fastcgi_params;
# Useless here since SCRIPT_FILENAME will never be a directory indeed
fastcgi_index index.php;
location /blog/post {
fastcgi_pass 127.0.0.1:9054;
fastcgi_param SCRIPT_FILENAME $document_root/data/core/blogpost.php;
include fastcgi_params;
}
}
Это исправление моего вопроса, после большого исследования проблем я обнаружил, что это было довольно просто:
server {
listen 127.0.0.1:80;
server_name virjox www.virjox;
root home/virjox/public_html;
index index.php;
log_not_found off;
#access_log logs/virjox-access.log;
charset utf-8;
sendfile on;
location ~ /\. { deny all; }
location = /favicon.ico { }
location = /robots.txt { }
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9054;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
rewrite ^/(.*)\.html /$1\.php;
}
location /blog {
rewrite ^/blog(|/)$ /data/core/blog.php;
}
}
и это отлично работает.