Я получал ошибки 403 и 404 в приложении Magento, над которым я работал. Я отследил проблему до двух блоков в конфигурации NGINX, если я их прокомментирую, проблемы решены, но я хотел бы лучше понять, что я комментирую .
ВЫПУСК 1
Я получал ошибку 403 для таких URL-адресов, как
http://www.example.com/media/wysiwyg/.thumbs/wysiwyg/banner.jpg
Я предположил, что это произошло из-за приведенного ниже блока кода, и, конечно же, когда я прокомментировал это, он сработал!
# Deny all attempts to access hidden files
# such as .htaccess, .htpasswd, etc...
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
Проблема с этим сейчас в том, что мои .gitignore
файл теперь доступен. Как лучше переписать этот блок? Что значит ~ /\.
значит?
ВЫПУСК 2
Я получал ошибку 404 для таких URL-адресов, как:
http://www.example.com/js/gene/braintree/braintree-0.1.js
Я обнаружил, изменил ли я имя этого файла на braintree-0.1.min.js
Я перестал получать ошибку 404, и когда я удалил нижеследующий блок из NGINX, он отлично загрузился с исходным именем, braintree-0.1.js
так что это должно быть связано с точками в конце имени файла.
##
# Rewrite for versioned CSS+JS via filemtime
##
location ~* ^.+\.(css|js)$ {
rewrite ^(.+)\.(\d+)\.(css|js)$ $1.$3 last;
expires 31536000s;
access_log off;
log_not_found off;
add_header Pragma public;
add_header Cache-Control "max-age=31536000, public";
}
Я не совсем уверен, что делал этот блок и что ~* ^.+\.(css|js)$
значит, я уверен, что просто снял это с блога кого-то, кто это рекомендовал. Есть идеи, что он делает?
Ниже мой полный файл конфигурации NGINX, заранее спасибо за любую помощь и совет, которые могут у вас возникнуть :)
server {# Слушает порт 80, а также сообщение 443 для соединений SSL. слушайте 8080; #listen 443 по умолчанию ssl;
server_name www.example.com;
# Specify path to your SSL certificates.
#ssl_certificate /etc/nginx/certificates/yourcertificate.crt;
#ssl_certificate_key /etc/nginx/certificates/yourcertificate.key;
# Path to the files in which you wish to
# store your access and error logs.
#access_log /path/to/your/logs/access_log;
#error_log /path/to/your/logs/error_log;
# If the site is accessed via mydomain.com
# automatically redirect to www.magento.localhost.com.
#if ($host = 'example' ) {
#rewrite ^/(.*)$ http://www.example/$1permanent;
#}
root /var/www/example/;
auth_basic "Restricted website - authorised access only";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
index index.html index.htm index.php;
try_files $uri $uri/ @handler;
}
#include hhvm.conf; # INCLUDE HHVM HERE
# Deny access to specific directories no one
# in particular needs access to anyways.
location /app/ { deny all; }
location /includes/ { deny all; }
location /lib/ { deny all; }
location /media/downloadable/ { deny all; }
location /pkginfo/ { deny all; }
location /report/config.xml { deny all; }
location /var/ { deny all; }
# Allow only those who have a login name and password
# to view the export folder. Refer to /etc/nginx/htpassword.
#location /var/export/ {
# auth_basic "Restricted";
# auth_basic_user_file htpasswd;
# autoindex on;
#}
location ~* /magmi($|/) {
auth_basic "Restricted website - authorised access only";
auth_basic_user_file /etc/nginx/.htpasswd;
location ~ \.php$ {
if (!-e $request_filename) {
rewrite / /index.php last;
}
expires off;
# --PHP5-FPM CONFIG START (keep fastcgi_param HTTPS OFF)--
#fastcgi_pass unix:/var/run/php5-fpm.sock;
##fastcgi_param HTTPS $fastcgi_https;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# --PHP5-FPM CONFIG START--
# --HHVM CONFIG START--
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# include fastcgi_params;
try_files $uri $uri/ @handler;
# --HHVM CONFIG END--
fastcgi_param MAGE_RUN_CODE default;
fastcgi_param MAGE_RUN_TYPE store;
include fastcgi_params;
}
}
# Deny all attempts to access hidden files
# such as .htaccess, .htpasswd, etc...
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# This redirect is added so to use Magentos
# common front handler when handling incoming URLs.
location @handler {
rewrite / /index.php;
}
# Forward paths such as /js/index.php/x.js
# to their relevant handler.
location ~ .php/ {
rewrite ^(.*.php)/ $1 last;
}
##
# Rewrite for versioned CSS+JS via filemtime
##
location ~* ^.+\.(css|js)$ {
rewrite ^(.+)\.(\d+)\.(css|js)$ $1.$3 last;
expires 31536000s;
access_log off;
log_not_found off;
add_header Pragma public;
add_header Cache-Control "max-age=31536000, public";
}
##
# Aggressive caching for static files
# If you alter static files often, please use
# add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
##
location ~* \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|ogv|otf|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|t?gz|tif|tiff|ttf|wav|webm|wma|woff|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
expires 31536000s;
access_log off;
log_not_found off;
add_header Pragma public;
add_header Cache-Control "max-age=31536000, public";
}
# Handle the exectution of .php files.
location ~ .php$ {
if (!-e $request_filename) {
rewrite / /index.php last;
}
expires off;
# --PHP5-FPM CONFIG START (keep fastcgi_param HTTPS OFF)--
#fastcgi_pass unix:/var/run/php5-fpm.sock;
##fastcgi_param HTTPS $fastcgi_https;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# --PHP5-FPM CONFIG START--
# --HHVM CONFIG START--
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#include fastcgi_params;
try_files $uri $uri/ @handler;
# --HHVM CONFIG END--
fastcgi_param MAGE_RUN_CODE default;
fastcgi_param MAGE_RUN_TYPE store;
include fastcgi_params;
}
}
Что делает ~ /. значит?
Это, конечно, объясняется во многих уроках:
И официальные документы:
http://nginx.org/en/docs/beginners_guide.html
http://nginx.org/en/docs/http/request_processing.html
~ Означает, что следует регулярное выражение, а не точное совпадение. /. означает экранированную точку, то есть буквальную, а не значение «любой символ» в регулярных выражениях. Это соответствует .thumb так же, как и .htaccess и .gitignore
Как лучше переписать этот блок?
Сделав так, чтобы оно соответствовало тому, что вы хотите. Например, если вас интересует только .gitignore, вы делаете это:
~ /\.gitignore
Я не совсем уверен, что делал этот блок или что означает ~ * ^. +. (Css | js) $, я уверен, что просто снял его с блога кого-то, кто его рекомендовал. Есть идеи, что он делает?
Конечно, и вы тоже, если потратите немного времени на изучение регулярных выражений.
Теперь вы знаете, что ~ означает, что следует регулярное выражение. Звездочка означает, что в регулярном выражении регистр не учитывается. Остальное можно объяснить множеством удобных онлайн-инструментов, таких как:
Вы помещаете туда свое регулярное выражение и строку, которую вы сопоставляете, ваш URL-адрес js. Затем он скажет вам:
^ подтвердить позицию в начале строки
. + соответствует любому символу (кроме новой строки)
Квантификатор: + От одного до неограниченного количества раз, столько раз, сколько возможно, отдача по мере необходимости [жадный]
. соответствует персонажу. буквально
1-я группа захвата (css | js)
1-я альтернатива:
css css буквально соответствует символам css (с учетом регистра)
Вторая альтернатива: js
js буквально соответствует символам js (с учетом регистра)
$ assert позиция в конце строки
Вы, наверное, хотели спросить, как улучшить его. Это зависит от того, чего вы хотите достичь.
Урок вот такой:
1) Изучите некоторые регулярные выражения. 2) Не просто "снимайте с блога кого-то, кто это рекомендовал". Это опасно в мире ИТ.
Вместо случайного блога попробуйте придерживаться (отчасти) официальных документов:
https://wiki.magento.com/display/m1wiki/Configuring+nginx+for+Magento+1.x
https://github.com/magenx/nginx-config/blob/master/magento/nginx.conf
Magento 2: https://github.com/magento/magento2/blob/develop/nginx.conf.sample