Хост Стейси на сервере nginx? (конвертировать.htaccess в nginx)
Стейси - легкая система управления контентом. Я использую его на своем веб-сайте porfolio, однако он использует файл.htaccess для создания дружественных URL. Можно ли переписать эти строки.htaccess для использования в nginx? Вот содержимое файла.htaccess;
RewriteEngine on
# Some hosts require a rewritebase rule, if so, uncomment the RewriteBase line below. If you are running from a subdirectory, your rewritebase should match the name of the path to where stacey is stored.
# ie. if in a folder named 'stacey', RewriteBase /stacey
#RewriteBase /
ErrorDocument 404 /404.html
# Rewrite any calls to *.html, *.json, *.xml, *.atom, *.rss, *.rdf or *.txt if a folder matching * exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !public/
RewriteCond %{DOCUMENT_ROOT}/public/$1.$2 !-f
RewriteRule (.+)\.(html|json|xml|atom|rss|rdf|txt)$ $1/ [L]
# Add a trailing slash to directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.|\?)
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ([^/]+)$ $1/ [L]
# Rewrite any calls to /render to the image parser
RewriteCond %{REQUEST_URI} render/
RewriteRule ^render/. app/parsers/slir/ [L]
# Rewrite any calls to /* or /app to the index.php file
RewriteCond %{REQUEST_URI} /app/$
RewriteRule ^app/ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ index.php?/$1/ [L,QSA]
# Rewrite any file calls to the public directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !public/
RewriteRule ^(.+)$ public/$1 [L]`
Заранее спасибо!
Я достиг некоторого прогресса. Вот;
location / {
if ($uri ~ "/app/$"){
rewrite ^/app/ /index.php last;
}
if (!-e $request_filename){
rewrite ^/(.*)/$ /index.php?$1 last;
}
if (!-f $request_filename) {
rewrite ^/(?!public/)(.+);
}
if (!-f $request_filename) {
rewrite ^/(?!public/)(.+)\.(html|json|xml|atom|rss|rdf|txt)$ $1/ last;
}
if (!-e $request_filename) {
rewrite ^/(?!public/)(.+)$ public/$1 last;
}
Это переписать все проекты без проблем прямо сейчас. Например;
domain.com/?/projects/project-name-3/ стал domain.com/projects/project-name-3/
но есть и еще 2 страницы. один из них "о" и один из "связаться со мной" . они также стали; domain.com/about и domain.com/contact-me, но когда я нажимаю на них, страница загружается, но без CSS-стиля. какая-нибудь подсказка?
хорошо, новый код такой, и он дает мне ошибку; nginx: [emerg] неверное количество аргументов в директиве "переписать" в /etc/nginx/sites-enabled/domain.com:21
location / {
rewrite ^/app/ /index.php last;
}
if (!-e $request_filename){
rewrite ^/(.*)/$ /index.php?$1 last;
}
if (!-f $request_filename) {
rewrite ^/(?!public/)(.+);
}
if (!-f $request_filename) {
rewrite ^/(?!public/)(.+)\.(html|json|xml|atom|rss|rdf|txt)$ $2/ last;
}
try_files /public$uri /public$uri/ $uri $uri/ /index.php;
}
код в 21 строке;
rewrite ^/(?!public/)(.+);
3 ответа
Недавно я перенес некоторые сайты Stacey в Nginx, используя эту конфигурацию:
server {
root SERVER FILE LOCATION;
index index.php index.html index.htm;
# Make site accessible from
server_name YOUR IP OR DOMAIN NAME;
location / {
# Stacey Rules
error_page 404 /404.html;
# Rewrite any calls to /render to the image parser
rewrite ^/render/. /app/parsers/slir/ break;
# Rewrite any file calls to the public directory
try_files $uri $uri/ /index.php?$uri;
}
# Block access to .htaccess files
location ~ /\.ht {
deny all;
}
include /usr/local/nginx/conf/staticfiles.conf;
include /usr/local/nginx/conf/php.conf;
}
Примечание: включаемые файлы являются просто стандартными ссылками на страницы ошибок и конфигурацией PHP (Fast-cgi php-fpm), которую я собрал, чтобы сохранить повторение одной и той же вещи в нескольких установках сайта.
Вы большую часть пути там.
Три из пяти rewrite
s можно заменить на nginx гораздо быстрее и проще try_files
директивы. Можно немного упростить. Пятый имеет логическую ошибку, как указано в вашем вопросе.
Во-первых, вам не нужно помещать этот чек в
if
так как он содержит свой собственный шаблон сопоставления.location / { rewrite ^/app/ /index.php last;
Это также может быть размещено в своем собственном
location
блокировать, но оставить это на потом...Во-вторых, ваша логическая ошибка. Когда вы переписали это правило, вы изменили два
()
шаблон соответствует трем, но не отрегулировал обратную ссылку$1
в$2
для учета его измененной позиции в новом регулярном выражении.if (!-f $request_filename) { rewrite ^/(?!public/)(.+)\.(html|json|xml|atom|rss|rdf|txt)$ $2/ last; }
В заключение,
try_files
, Для очень простых матчей это намного быстрее, чемrewrite
а также легче понять. Так...try_files /public$uri /public$uri/ $uri $uri/ /index.php; }
Это должно помочь вам в 99% случаев, за исключением последних изменений, основанных на информации, не имеющей отношения к вашему вопросу.
Я использую Stacey CMS, вот что я использую для конфигурации Nginx вместо Apache:
server {
listen 80;
server_name localhost;
root /home/vagrant/test;
index index.php index.html index.htm;
error_page 404 /404.html;
location / {
if ($query_string != "") {
return 301 $scheme://$http_host$query_string;
}
try_files $uri $uri/ /index.php?$uri;
}
location ~ \.php$ {
try_files $uri =403;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
если if
блок определенно не идеален или идиоматичен с конфигами nginx. Здесь необходимо работать со Стейси Тхо.