Назад | Перейти на главную страницу

Правильный синтаксис перезаписи для удаления index.php

У меня есть nginx vHost, на котором размещаются:

Все идет нормально, за исключением одного:

Удаление index.php из URL. На данный момент работают следующие URL

example.com/store/index.php/my-funny-test-product.html and (as there are a few subshops in magento) 
example.com/store/index.php/city/my-funny-test-product.html

Теперь мне нужно создать перенаправление, чтобы index.php можно было удалить из URL-адреса.

example.com/store/my-funny-test-product.html or example.com/store/city/my-funny-test-product.html

Я заставил его работать на моем локальном Apache с этим .htaccess

RewriteEngine on
RewriteBase /store/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule .* index.php [L]

На основе этого я построил следующую перезапись

location /store {
   rewrite ^/store /store/index.php;
}

Сейчас example.com/store/my-funny-test-product.html работает, но изображения CSS и тому подобное не работают! Я пробовал добавить if (!-e $request_filename) чтобы исправить это, но затем получил ошибку nginx 40x.

Как мне добиться рабочего переписывания example.com/store/my-funny-test-product.html и example.com/store/city/my-funny-test-product.html в подпапку / магазин, не нарушая css & co и не имея index.php в URL-адресе?

Вот полный конфиг vhost

    ## The whole setup stays close with the magento recommendations
    ## http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/configuring_nginx_for_magento

server {
    listen myip:80;
    server_name .example.com;

    root /var/www/mydomain/public_html;

    location / {
        index index.html index.php;
        try_files $uri $uri/ @handler;  
    }

    ## here comes my rewrite stuff to remove index.php from the subfolder ##
   location /store {
       rewrite ^/store /store/index.php;
   }

    ## followed by some deny rulesets not relevant here ##

    location @handler { ## Magento common front handler
        rewrite / /index.php;
    }

    location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
        rewrite ^(.*.php)/ $1 last;
    }

    location ~ .php$ { ## Execute PHP scripts
        if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss

        expires        off; ## Do not cache dynamic content
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  HTTPS $fastcgi_https;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  MAGE_RUN_CODE default; ## Store code is defined in administration > Configuration > Manage Stores
        fastcgi_param  MAGE_RUN_TYPE store;
        include        fastcgi_params; ## See /etc/nginx/fastcgi_params
    }

Теперь example.com/store/my-funny-test-product.html работает, но изображения CSS и т.п. не работают!

Использовать пробные файлы

Запросы файлов css (или любых фактических файлов в /var/www/example.com/public_html/store) не работают в данный момент, потому что реквизит безоговорочно перенаправляется на /store/index.php. Минимальное изменение, необходимое для того, чтобы это работало, - это использовать try_files:

## here comes my rewrite stuff to remove index.php from the subfolder ##
location /store {
    # rewrite ^/store /store/index.php; NO
    try_files $uri /store/index.php;
}

Таким образом, если существует следующий файл:

/var/www/example.com/public_html/store/css/style.css

Тогда следующий URL вернет свое содержимое:

http://example.com/store/css/style.css

И любой запрос, начинающийся с /store который не отображается напрямую в файл, будет передан в /store/index.php.

Затем добавьте следующий код в этот только что созданный файл .htaccess.

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC]
RewriteRule ^ %1 [R=301,L]