У меня есть nginx vHost, на котором размещаются:
/
/store
Все идет нормально, за исключением одного:
Удаление 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]