Задать вопрос
ertaquo
@ertaquo

Apache удаляет слэши

Держу небольшой QR-кодер по адресу http://qr.nizarium.com/. По идее, он должен кодировать все, что находится в строке запроса:
http://qr.nizarium.com/what-you-want-to-encode
На деле же при попытке кодирования URL обрезаются слэши:
http://habrahabr.ru/ => http://qr.nizarium.com/http%3A%2F%2Fhabrahabr.ru%2F => http:/habrahabr.ru/
Это превращает адрес сайта после распознавания в нерабочий.
Виноват в этом Apache. Он удаляет «лишние» слэши, даже если они закодированы в urlencode. Найденный способ обрабатывать строку запроса также не срабатывает:
RewriteCond %{THE_REQUEST} ^[a-zA-Z]+\ ([^\ ]+)\ HTTP/
RewriteRule .* index.php?q=%1 [L]
Переводить под /?q=… не хочется. Как можно вернуть исчезнувшие слэши?
Apache/1.3.34

UPD: Перевел все на QUERY_STRING, но проблема актуальна.
  • Вопрос задан
  • 4067 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@phasma
> Переводить под /?q=… не хочется. Как можно вернуть исчезнувшие слэши?

написать реврайт.
Ответ написан
pel
@pel
RewriteCond %{THE_REQUEST} ^[a-zA-Z]+\ ([^\ ]+)\ HTTP/
RewriteRule .* index.php?q=%1 [L]

Скажите, зачем вам здесь RewriteCond, если в переменную q надо передать просто всё, что в строке запроса? И что это за пробелы (подчеркнуто: "… Z]+\ ([^\ ]+ ...")? Возможно, парсер зажевал.

Попробуйте оставить такую регулярку:
RewriteRule ^(.*)$ index.php?q=$1 [QSA, L]


Либо, если смотреть ваш коммент к предыдущему ответу, то там не хватает:
RewriteEngine on
RewriteBase / 
RewriteRule ^(.*)$ index.php?q=$1 [QSA,L]
Ответ написан
pel
@pel
> RewriteCond %{REQUEST_URI} !^/$? нужно для того, чтобы не было циклического перенаправления

У меня без этого нормально работает, не циклится. После первого перенаправления браузер обращается уже к существующему файлу и, соответственно, правило RewriteCond %{REQUEST_FILENAME} !-f уже не отработает.

У меня Apache 2.0. Возможно, действительно, в первом и это по-другому работает. К сожалению, самому проверить негде.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы