Я должен здесь не хватает чего-то действительно глупого, но я этого не вижу. У меня следующий формат URL:
https://www.example.com/french/xx/cats_59_H_L.html
... и это правило:
rewrite ^/french/.*/cats_([0-9]+)_([A-Z])_([A-Z])\.html$ /cgi-bin/hotels/related_cats.cgi?ID=$1&start=$2&end=$3&type=chambres&t=french last;
Однако оно дает 404:
2017/08/30 12:52:59 [error] 8041#8041: *1147655 open() "/home/user/web/example.com/public_html/french/xx/cats_59_H_L.html" failed (2: No such file or directory), client: 81.174.134.133, server: example.com, request: "GET /french/xx/cats_59_H_L.html HTTP/2.0", host: "www.example.com"
ОБНОВЛЕНИЕ: Хорошо, хорошо Я нашел нарушающее правило, но пытаюсь решить, как его обойти.
location /french {
include /home/fatpeter/conf/web/chambres.com.extra/other-cats-french.conf;
}
Моя основная конфигурация для домена:
server {
listen 111.74.193.98:443 http2;
listen [::]:443 http2;
server_name example.com www.example.com;
root /home/user/web/example.com/public_html;
index index.php index.html index.htm;
access_log /var/log/nginx/domains/example.com.log combined;
access_log /var/log/nginx/domains/example.com.bytes bytes;
error_log /var/log/nginx/domains/example.com.error.log error;
ssl on;
ssl_certificate /home/user/conf/web/ssl.example.com.pem;
ssl_certificate_key /home/user/conf/web/ssl.example.com.key;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
if ($host = "example.com") {
return 301 https://www.example.com$request_uri;
}
location / {
include /home/user/conf/web/nginx.example.com.rules.conf*;
ssi on;
location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
expires max;
}
location ~ \.cgi$ {
gzip off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8181;
}
location ~ [^/]\.php(/|$) {
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass 127.0.0.1:9002;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
}
error_page 403 /error/404.html;
error_page 404 /error/404.html;
error_page 500 502 503 504 /error/50x.html;
location /error/ {
alias /home/user/web/example.com/document_errors/;
}
location ~* "/\.(htaccess|htpasswd)$" {
deny all;
return 404;
}
location /vstats/ {
alias /home/user/web/example.com/stats/;
include /home/user/web/example.com/stats/auth.conf*;
}
include /etc/nginx/conf.d/phpmyadmin.inc*;
include /etc/nginx/conf.d/phppgadmin.inc*;
include /etc/nginx/conf.d/webmail.inc*;
include /home/user/conf/web/nginx.example.com.conf*;
}
Как видите, у нас есть вот это:
include /home/user/conf/web/nginx.example.com.rules.conf*;
Этот файл содержит:
include /home/user/conf/web/chambres.com.extra/301-redirects.conf;
include /home/user/conf/web/chambres.com.extra/glinks-rules.conf;
... а затем внутри 301-redirects.conf у нас есть:
location /french/Gites {
include /home/user/conf/web/chambres.com.extra/gites-cats-french.conf;
}
location /Gites {
include /home/user/conf/web/chambres.com.extra/gites-cats-english.conf;
}
location /french/Chambres_D_Hotes {
include /home/user/conf/web/chambres.com.extra/chambres-cats-french.conf;
}
location /Chambres_D_Hotes {
include /home/user/conf/web/chambres.com.extra/chambres-cats-english.conf;
}
location /french {
include /home/user/conf/web/chambres.com.extra/other-cats-french.conf;
}
Причина, по которой я сделал это таким образом, заключается в том, что у нас более 30 000 перезаписей для одного из верхнего уровня категории и 20, 000 правил в другом - поэтому я хотел разделить его, чтобы сэкономить на нагрузке.
Единственный способ, который я нашел вокруг этого, - это сделать:
location /french {
rewrite ^/french/.*/cats_([0-9]+)_([A-Z])_([A-Z])\.html$ /cgi-bin/hotels/related_cats.cgi?ID=$1&start=$2&end=$3&type=chambres&t=french last;
include /home/fatpeter/conf/web/chambres.com.extra/other-cats-french.conf;
}
Я думаю, это потому, что один блок останавливает другой. от бега, значит, они должны быть в одном блоке?
Скорее всего, nginx не видит перезапись. Регулярное выражение мне кажется правильным, поэтому я посмотрю, находится ли оно в правильном месте в вашей конфигурации nginx, и что ваш URI не используется другим местом или чем-то еще.
EDIT:
Судя по вашему варианту использования нескольких включений для 301, я предлагаю переместить все это на карту
. Это также может потенциально сделать это немного быстрее.
Например:
map $uri $is_rewrite { default no_redirect; "~/regex" "/kitten"; #... }; server { #... if ($is_rewrite != no_redirect) { rewrite .? $is_redirect permanent; } #... }
Самый простой способ - просто вставить его в файл, который вы включаете, из местоположения / french
. Просто подумал, что упомяну карты, они могут облегчить вам жизнь :)