Порядок, в котором связаны библиотеки, имеет значение, если библиотеки зависят друг от друга. В общем случае, если библиотека A
зависит от библиотеки B
, тогда libA
ДОЛЖЕН появляться перед libB
в флагах компоновщика.
Например:
// B.h
#ifndef B_H
#define B_H
struct B {
B(int);
int x;
};
#endif
// B.cpp
#include "B.h"
B::B(int xx) : x(xx) {}
// A.h
#include "B.h"
struct A {
A(int x);
B b;
};
// A.cpp
#include "A.h"
A::A(int x) : b(x) {}
// main.cpp
#include "A.h"
int main() {
A a(5);
return 0;
};
Создайте библиотеки:
$ g++ -c A.cpp
$ g++ -c B.cpp
$ ar rvs libA.a A.o
ar: creating libA.a
a - A.o
$ ar rvs libB.a B.o
ar: creating libB.a
a - B.o
Скомпилируйте:
$ g++ main.cpp -L. -lB -lA
./libA.a(A.o): In function `A::A(int)':
A.cpp:(.text+0x1c): undefined reference to `B::B(int)'
collect2: error: ld returned 1 exit status
$ g++ main.cpp -L. -lA -lB
$ ./a.out
Чтобы повторить снова, порядок имеет значение!
Мне удалось решить более общий случай, когда место перенаправления может быть любым внешним URL.
server {
...
location / {
proxy_pass http://backend;
# You may need to uncomment the following line if your redirects are relative, e.g. /foo/bar
#proxy_redirect / /;
proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirects;
}
location @handle_redirects {
set $saved_redirect_location '$upstream_http_location';
proxy_pass $saved_redirect_location;
}
}
Альтернативный подход, который ближе к тому, что вы описываете, рассматривается в ответе ServerFault на этот вопрос : https://serverfault.com/questions/641070/nginx-302-redirect-resolve-internally
Если вам нужно выполнить несколько переадресаций, измените решение Влада следующим образом:
1) Добавьте
recursive_error_pages on;
в location /
.
2 ) Добавьте
proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirect;
в раздел location @handle_redirects
.
Вы можете использовать директиву proxy_redirect
:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect
] Nginx все равно вернет 301/302 клиенту, но proxy_redirect
изменит заголовок Location
, и клиент должен сделать новый запрос к URL-адресу, указанному в заголовке Location
.
Что-то вроде этого должен сделать последующий запрос обратно nginx:
blockquote>
proxy_redirect http://upstream:port/ http://$http_host/;