необходимо экранировать символ # (хеш / фунт) в правиле перезаписи .htaccess - PullRequest
14 голосов
/ 27 августа 2010

Вопрос довольно простой, но я не мог найти ответ в течение нескольких часов.

Что мне нужно сделать, это:

RewriteRule ([^#])#(.*) $1\%23$2

Что в основном означает, что я хочу, чтобы URL избежал офигенного знака хеша, который приходит ко мне от внешнего кодового фрагмента.

Обратная косая черта (\) не работает, чтобы избежать этого знака ... и, пожалуйста, не предлагайте использовать %23 вместо #, потому что он не работает также.

(%2 3 не соответствует #, потому что это просто не == %23)

Ответы [ 4 ]

29 голосов
/ 08 июля 2012

Я только что получил эту работу для сайта после нескольких сообщений на этом форуме, я использую правило перезаписи с NE not escape и опциями перенаправления R = 301:

RewriteRule ^galleries/([a-zA-Z0-9_-]+)$ /gallery.html#/$1 [R=301,NE,L]

Это перенаправляет все галереи / переменную в / gallery.html # / переменную

Редактировать: Важной частью правила является NE, который инструктирует сервер анализировать выходные данные без экранирования символов. Без этого он попытается избежать # в правиле перезаписи, о котором спрашивает OP.

9 голосов
/ 27 августа 2010

Хеш-часть URL недоступна для перезаписи. Когда веб-браузер отправляет запрос URL на веб-сервер, он отправляет все до хеш-знака Хеш доступен только на клиенте (например, код JavaScript может видеть его).

2 голосов
/ 12 апреля 2011

Поиск Расширенное перенаправление in http://httpd.apache.org/docs/2.0/misc/rewriteguide.html.Есть хорошее решение для вашего вопроса.

0 голосов
/ 27 февраля 2011

.htaccess

RewriteRule  old\.php redirect.php?url=http://example.com/new.php|hash [R=301,QSA,L]

redirect.php

<?php
    $new_url = str_replace("|", "#", $_GET['url']);
    header("Location: ".$new_url, 301);
    die;
?>
...