2015-04-17 3 views
0

я начал видеть ошибки 404 в моих журналах для URL-адресов, как:Проблемы с простым HTAccess RewriteRule удалить% 23 от конца URL

http://site.example.com/foo/bar.html%23anchor 

Очевидно, что #anchor был кодируется (вероятно, в чужой адрес электронной почты, что я не может контролировать), что приводит к сломанным ссылкам. Якорные ссылки не так важны, но я не хочу, чтобы мои пользователи видели 404 страницы. Я думал, что смогу исправить это с помощью простой перезаписи, но ничего, что я пробовал, не работал, и ни один из ответов SO, на которые я смотрел, не работал.

Коды перезаписи, которые я пробовал, отлично работали в RegExr и regex101, но когда я пытаюсь использовать его в моем .htaccess, плохая ссылка по-прежнему приводит к ошибке 404. У меня есть другие RewriteRules, но я не могу удалить нежелательный% 23anchor с конца запроса.

RewriteEngine on 
RewriteBase /site 

## Externally redirect non-canonical domain requests to canonical domain. ### 
## This rule works ### 
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] 
RewriteRule ^(.*)$ http://site.example.com/$1 [R=301,NC,L] 

## This rule doesn't work ### 
RewriteRule ^(\.html)(%23)(.*)$ $1 [R=302,NE,L] 

Мне нужно изменить: http://site.example.com/foo/bar.html%23anchor

в этом: http://site.example.com/foo/bar.html

Что мне не хватает?

+0

«RewriteRule»^(. +? \. Html) \ # "$ 1 [R = 302, L]' NE означает отсутствие экранированного результата url-string – Deadooshka

+0

Это правило привело к 'http: //site.example. ком/сайт/Foo/bar.html'. Он удалил неправильный якорь с конца, но все же привел к 404. Обратите внимание на дополнительный «сайт», вызванный правилом RewriteBase. – rmunde

ответ

0

Благодарим вас за все ваши предложения, но ни одна из них не решила начальную проблему. Поскольку правило RewriteBase влияет на все относительные перезаписи, я не видел способа написать это правило, как я изначально планировал. В итоге единственное, что, казалось, работало, это переписать на абсолютный путь. Это правило, в котором я закончил. Это не является гибким и работает только на этой странице, но, по крайней мере, она фиксирует конкретные неработающую ссылку, я сейчас пытаюсь исправить:

RewriteRule ^(.*bar\.html)\x23.*$ http://site.example.com/foo/bar.html [R=302,NE,L,NC]

Указанное правило переписывает это: http://site.example.com/foo/bar.html%23anchor

к этому: http://site.example.com/foo/bar.html

0

У вас отсутствует все, что находится перед «.html». Попробуйте это переписывание:

RewriteRule ^(.*\.html)(%23)(.*)$ $1 [R=302,NE,L] 

https://regex101.com/r/fV3oU3/1

+0

Поскольку мне не разрешено добавлять комментарий к ответу anubhavas ниже, я делаю это здесь ..... @anubhava вопрошающий хотел вырезать все после% 23, включая% 23 ... Ваша перепись добавит все который следует за заменой% 23. Таким образом, вы должны удалить $ 2. –

+0

Да, это то, что, как я думал, должно было работать, и оно работает так, как ожидалось в RegEx101. Но при применении через htaccess это приводит к 'http: // site.example.com/foo/bar.html% 23anchor': оригинальной плохой ссылке. Это правило, похоже, не имеет никакого эффекта. – rmunde

0

Замените последнее правило с этим:

RewriteRule ^(.+?\.html)\x23 /$1 [R=302,NE,L,NC] 

%23 является спичек \x23 в RewriteRule.

+0

Это правило привело к 'http: // site.example.com/site/foo/bar.htmlanchor' и ошибке 404.Он правильно удалил% 23, но сохранил текст «якоря», а также был изменен правилом RewriteBase и добавил дополнительный субтитр «сайт». – rmunde

+0

ok попробуйте мое обновленное правило. – anubhava

+0

Спасибо, что удалили строку привязки с конца, но все же привели к 404 из-за правила RewriteBase, добавляющего поддиск: 'http: // site.example.com/SITE/foo/bar.html' – rmunde