Я пытался удалить ЛЮБЫЕ / ВСЕ дефисы и подчеркивания _ из входящего URL-запроса на мой сервер nginx.
Чтобы было ясно, когда кто-то вводит URL-адрес следующим образом:
https://www.example.com/my-name_is-tom
... Мне нужно, чтобы nginx переписал URL-адрес следующим образом:
https://www.example.com/mynameistom
Я работаю со следующей конфигурацией:
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name top.example.com;
ssl_certificate /etc/ssl/top.example.com.crt;
ssl_certificate_key /etc/ssl/top.example.com.key;
# set the root
root /srv/top.exemple.com;
index index.html;
location ~ ^/([a-zA-Z0-9=\?\_\-]+)$ {
rewrite ^(/.*)-(.*)$ $1$2 last;
rewrite ^(/.*)_(.*)$ $1$2 last;
rewrite ^/(.*)$ / break;
}
location / {
ssi on;
}
# BOSH
location /http-bind {
proxy_pass http://localhost:0000/http-bind;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
}
... однако я не вижу возможности переписывания.
Может, я неправильно переписал эту локацию?
Может мне нужно как-то переписать X-Forward-For $ remote_addr; ???
Любые идеи / предложения будут ОЧЕНЬ признательны - я просто не очень разбираюсь в nginx и regexp.
Заранее всем спасибо за уделенное время и внимание.
РЕДАКТИРОВАТЬ / PS. Похоже, мне нужно какое-то правило, которое удаляет не буквенно-цифровые символы из $ request_uri. Итак, это:
example.com/my-name-is-tom.html
будет визуально переписано в поле URL браузера на:
example.com/mynameistomhtml
Я понимаю, насколько это странно звучит, но ... вот что должно произойти.
Любое дальнейшее понимание будет чрезвычайно полезно. ТЫ!
Чтобы изменить URL-адрес, отображаемый в адресном поле браузера клиента, вам понадобится внешнее перенаправление:
rewrite ^(.*)[-_](.*)$ $1$2 permanent;
Если вам необходимо ограничить объем перезаписи, например, чтобы /http-bind/
является не переписать, вы можете сделать регулярное выражение более конкретным:
rewrite ^(/[^/]*)[-_]([^/]*)$ $1$2 permanent;
Объяснение: захватить и сопоставить начальную косую черту, за которой следует ноль или более символов без косой черты. Соответствует дефису или подчеркиванию. Захватите и сопоставьте ноль или более символов без косой черты.
Обе перезаписи будут перенаправлять с ответом HTTP 301, многократно, пока все [-_]
удалены.
Поместите rewrite
перед первым location
блок.
Если вы поместите rewrite
внутри location
блок, убедитесь, что расположение соответствует диапазону URI, который, как ожидается, перезаписывается при перезаписи. Однако правило перезаписи уже довольно специфично, поэтому наличие блока местоположения довольно избыточно.
Видеть этот документ для большего.