#regex #nginx
Вопрос:
Я пытаюсь переписать языковую часть URL-адресов для своего веб-сайта. Например:
www.site.com/nl-NL Для www.site.com/nl-BE
и
www.site.com/nl-NL/test/rest Для www.site.com/nl-BE/test/rest
Я заставил работать первый, но он отсекает часть /test/rest для второго.
Я использую это в своей конфигурации nginx:
rewrite ^/nl-NL/(.*)$ /nl-BE/$1 permanent;
Даже все URL-адреса /nl-BE/… перенаправляются на /nl-BE
Есть идеи, что я делаю не так?
Мой файл nginx:
server {
server_name site.com;
root /var/www/staging/site/front;
index index.html index.htm index.php;
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
gzip on;
gzip_min_length 128;
gzip_comp_level 5;
gzip_proxied any;
gzip_vary on;
gzip_types
application/atom xml
application/javascript
application/json
application/ld json
application/manifest json
application/rss xml
application/vnd.geo json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest json
application/xhtml xml
application/xml
font/opentype
image/bmp
image/svg xml
image/x-icon
text/cache-manifest
text/css
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
set $skip_cache 1;
location / {
expires 1h;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Cache-Status $upstream_cache_status;
add_header X-Developer "Name";
if ($request_uri ~* ".(ico|woff|woff2|css|js|svg|gif|jpe?g|png)$") {
expires 100d;
access_log off;
add_header Pragma public;
add_header Cache-Control "public";
break;
}
if ($request_uri ~* ".(js)$") {
expires 7d;
}
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_ignore_headers Cache-Control;
proxy_http_version 1.1;
proxy_read_timeout 1m;
proxy_connect_timeout 1m;
proxy_pass http://127.0.0.1:3000;
proxy_hide_header X-Powered-By;
}
location /forms {
set $skip_cache 1;
try_files $uri $uri/ /forms.php?$query_string;
}
location /geoip {
set $skip_cache 1;
try_files $uri $uri/ /geoip.php?$query_string;
}
location /cacheclear.php {
set $skip_cache 1;
try_files $uri $uri/ /cacheclear.php?$query_string;
}
location /sitemap.xml {
try_files $uri $uri/ /sitemap.php?$query_string;
}
location ~ .php$ {
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache php_cache;
fastcgi_cache_valid 200 999999999m;
fastcgi_cache_methods GET;
fastcgi_split_path_info ^(. ?.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
#Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
location /nl-NL {
rewrite ^/nl-NL$ /nl-BE permanent;
}
listen 80;
}
Комментарии:
1. На первый взгляд не кажется, что в этой строке есть ошибка, могу ли я увидеть остальную конфигурацию?
2. Это довольно большой файл, но я только что добавил его
3. Вот одна идея, не уверен, что она сработает.
location ~ ^/nl-NL(?<local_path>/.*) { rewrite ^/nl-NL/.*$ /nl-BE$local_path permanent; }
4. Как вы это проверяете? Используйте
curl -I
для проверки ответа от Nginx, так как браузеры могут давать запутанные результаты.rewrite
В верхней части вашего вопроса все в порядке.rewrite
В конфигурации, которую вы опубликовали, явно что-то не так.5. @FonsVC Удалите этот
location /nl-NL { ... }
блок и добавьтеrewrite ^/nl-NL(/?.*)$ /nl-BE$1 permanent;
вместо него.