2016-01-27 4 views
1

Я пытаюсь перенести мое веб-приложение php из Apache в Nginx. И у меня есть огромная проблема с преобразованием правил перезаписи.Apache to nginx migration, переписать проблемы с .htaccess

Я использовал несколько преобразователей. Даже знаю, как преобразовать его сам, но в конце я заканчиваю с таким же результатом. Страница по умолчанию загружает исходный код php вместо показа страницы.

Если я установил корень непосредственно в общую папку и удалю правила перезаписи. Отображается страница по умолчанию, но без css, изображений и со сломанными ссылками. Но это похоже на то, что то же самое происходит локально (с Apache), если я устанавливаю DocumentRoot в общедоступный и удаляю файлы .htacces.

PHP использует структуру Phalcon. Файлы * .volt скомпилированы в * .volt.php во время «php runtime».

Вот мое дерево приложений.

<repo> 
├── app 
│   ├── config 
│   │   ├── autoloader.php 
│   │   ├── config.ini 
│   │   └── services.php 
│   ├── controllers 
│   │   ├── CategoryController.php 
│   │   ├── ControllerBase.php 
│   │   ├── IndexController.php 
│   │   ├── LoginController.php 
│   │   ├── ProductController.php 
│   │   ├── ProfileController.php 
│   │   ├── RankController.php 
│   │   └── SignupController.php 
│   ├── library 
│   │   └── Elements.php 
│   ├── models 
│   │   ├── Category.php 
│   │   ├── CurlHandler.php 
│   │   ├── OpinionVote.php 
│   │   ├── Product.php 
│   │   ├── REST.php 
│   │   ├── Users.php 
│   │   └── Validator.php 
│   └── views 
│    ├── category 
│    │   └── show.volt 
│    ├── index 
│    │   └── index.volt 
│    ├── index.volt 
│    ├── layouts 
│    │   ├── footer.volt 
│    │   ├── leftColumn.volt 
│    │   ├── logo.volt 
│    │   └── topMenu.volt 
│    ├── login 
│    │   └── index.volt 
│    ├── product 
│    │   └── show.volt 
│    ├── profile 
│    │   ├── addCategory.volt 
│    │   ├── addProduct.volt 
│    │   ├── deleteCategory.volt 
│    │   └── index.volt 
│    ├── rank 
│    │   ├── bottom.volt 
│    │   ├── index.volt 
│    │   └── top.volt 
│    └── signup 
│     └── index.volt 
├── public 
│   ├── css 
│   │   └── main.css 
│   ├── img 
│   │   └── oceniarka-logo.png 
│   ├── index.php 
│   ├── scripts 
│   │   └── opinionVoteJs.js 
│   └── signup.php 
└── README.md 

В config.in BaseUri =/

Htaccesses

/.htaccess

RewriteEngine on 
RewriteRule ^$ public/ [L] 
RewriteRule ((?s).*) public/$1 [L] 

/public/.htaccess

Options +FollowSymLinks 
    RewriteEngine On 

RewriteRule ^.*/img/([a-zA-Z0-9-]+)[.]png$ img/$1.png [L] 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L] 

Это моя конфигурация nginx.

server { 
    listen ${OPENSHIFT_DIY_IP}:${OPENSHIFT_DIY_PORT}; 
    server_name localhost; 

    root ${OPENSHIFT_REPO_DIR}; 

    add_header Strict-Transport-Security max-age=691200; 

    location/{ 
     index index.php index.html index.htm; 
     rewrite ^/$ /public/ break; 
     rewrite ((?s).*) /public/$1 break; 
    } 

    try_files $uri $uri/ @rewrites; 

location /public { 
    rewrite ^/.*/img/([a-zA-Z0-9-]+)[.]png$ /img/$1.png last; 
    if (!-d $request_filename) { 
     set $rule_1 1$rule_1; 
    } 
    if (!-f $request_filename) { 
     set $rule_1 2$rule_1; 
    } 
    if ($rule_1 = "21") { 
     rewrite ^/((?s).*)$ /index.php?_url=/$1 last; 
    } 
    } 


    location = /robots.txt { access_log off; log_not_found off; } 

    location ~ /\.   { access_log off; log_not_found off; deny all; } 
    location ~ ~$   { access_log off; log_not_found off; deny all; } 

    # Set expires max on static file types 
    location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm)$ { 
     access_log off; 
     log_not_found off; 

     # Some basic cache-control for static files to be sent to the browser 
     expires max; 
     add_header Pragma public; 
     add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
    } 

    location @rewrites { 
     rewrite ^(.*)$ /index.php?_url=/$1; 
    } 

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
    location ~ ^/index\.php(/|$) { 
     fastcgi_pass unix:${OPENSHIFT_RUN_DIR}/php-fpm.socket; 

     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param PATH_INFO $fastcgi_script_name; 

     include fastcgi_params; 
    } 
} 

Я был бы признателен за любую помощь.

+0

Используйте 'location ~ \ .php $' вместо 'location ~ ^/index \ .php (/ | $)' –

+0

Я думал, что файлы .htaccess' не работают на nginx? – Darren

ответ

0

Вам необходимо переписать свои URI и добавить префикс /public. Это влияет на все ваши файлы, включая файлы PHP, и может быть разрешено с помощью вложенных блоков местоположения.

root ...; 

index index.php index.html index.htm; 

location/{ 
    rewrite^/public$request_uri last; 
} 

location /public { 
    try_files $uri $uri/ /public/index.php?_url=$uri&$args; 

    location ~ \.php(/|$) { 
     ... 
    } 
    location ~* \.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm)$ { 
     rewrite (/img/.+\.png)$ /public$1 break; 
     ... 
    } 
} 

location = /robots.txt { access_log off; log_not_found off; } 
location ~ /\.   { access_log off; log_not_found off; deny all; } 
location ~ ~$   { access_log off; log_not_found off; deny all; } 

Я предполагаю, что /app путь никогда не обращались. Если это так, location / нуждается в модификации.

Ваш location ~ \.php(/|$) блок выглядит немного странно. Он принимает сценарии с сообщением , но затем не удается его сломать. Возможно, это работает с вашей конкретной реализацией PHP.

Альтернативный подход состоит в том, чтобы установить корень на .../public и определить, какие правила перезаписи необходимы, чтобы заставить URI-изгои работать. Возможно, удалить префикс /public.

Смежные вопросы