htaccess удалить только '?' знак из URL со строкой запроса

Как удалить знак ? из URL-адреса с помощью строки запроса


person Community    schedule 08.08.2012    source источник
comment
Поищите в гугле mod_rewrite   -  person gcochard    schedule 09.08.2012


Ответы (1)


RewriteEngine On

# This is to physically change what's in the browser's address bar using a client redirect
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\?([^\ ]+)
RewriteRule ^$ /%1? [R=301,L]

# This is to internally rewrite on the server side
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^/?(.+)$ /?$1 [L]

Также, пожалуйста, не могли бы вы объяснить мне, что означает [A-Z]{3,9}\ and ([^\ ]+) сам по себе? Где я могу прочитать о строительстве такого типа конструкций?

Это регулярное выражение используется для соответствия запросу HTTP, первая строка будет выглядеть примерно так:

GET /path/to/file HTTP/1.1

Первое слово — это METHOD, длина которого может составлять от 3 до 9 символов (таким образом, {3,9}, второе слово — это неизмененный URI запроса. Это то, что проходит через механизм перезаписи, но до того, как на нем будет выполнена какая-либо обработка пути.Последний бит - это версия протокола, он является необязательным и определяет, будут ли после этого заголовки.

person Jon Lin    schedule 08.08.2012
comment
Не работает. Я получаю внутреннюю ошибку сервера после применения строки: RewriteRule ^/?$ /%1 [L] - person andrew; 09.08.2012
comment
@user1586029 user1586029 Извините, я забыл ? в конце цели правила - person Jon Lin; 09.08.2012
comment
Ммм, я очень ценю твои усилия для меня. Но, кажется, результаты все еще не так велики. Если я наберу mysite.com?page в поле адреса браузера, я попаду под Chrome, Firefox и IE mysite.com/?page, так что тот же вопросительный знак все еще там. Opera дает мне mysite.compage, Safari дает test.metal.by/page Не могу понять, в чем тут проблема. - person andrew; 09.08.2012
comment
@user1586029 user1586029 Есть две вещи, которые можно иметь в виду, когда говорят, что у меня есть этот URL, я хочу этот URL. Обычно это означает, что у вас есть какой-то URL-адрес, который вы генерируете, и его необходимо переписать внутренне во что-то, что может обрабатывать красивые URL-адреса. Если вы хотите перенаправить браузер (физически изменить то, что написано в адресной строке URL), то это совсем другое дело. Я отредактировал ответ, чтобы включить это. См. объяснение здесь: stackoverflow.com/a/11711948/851273 - person Jon Lin; 09.08.2012
comment
Спасибо за ссылку. Это было полезно. Я прочитал его и понял код. Пожалуйста, взгляните на это и исправьте то, что я сделал неправильно. Кажется, код в основном работает, но мой сервер теперь не получает значение строки запроса. Пожалуйста, посмотрите еще раз на первый пост. Я отредактировал это и попытался подробно описать ситуацию в соответствии с обновленными условиями. Также, пожалуйста, не могли бы вы объяснить мне, что означают [A-Z]{3,9}\ и ([^\ ]+) сами по себе? Где я могу прочитать о строительстве такого типа конструкций? - person andrew; 11.08.2012
comment
@user1586029 user1586029 Пожалуйста, посмотрите мое редактирование, в моих правилах была ошибка, попробуйте еще раз, а также посмотрите объяснение - person Jon Lin; 11.08.2012
comment
Кажется, что строка RewriteRule ^/?(.*)$ /?$1 [L] дает внутреннюю ошибку сервера. Потому что, если я прокомментирую, эта ошибка исчезнет. Я думаю, проблема в косой черте здесь ^/?(.*)$. Но с другой стороны правило без косой черты не работает. - person andrew; 14.08.2012
comment
@user1586029 user1586029 Да, это (.*) должно быть (.+) - person Jon Lin; 14.08.2012
comment
Потрясающий! Теперь это работает со строкой запроса, по крайней мере, во всех браузерах. Но появляются небольшие проблемы. Сначала посмотрите, у меня есть простой тестовый тег <img src=http://domain.tld/image/image.png>, и изображение не загружается на страницу после применения нового RewriteRule ^/?(.+)$ /?$1 [L]. Второе, и я думаю, что относительно первого, заключается в том, что когда я набираю URL-адрес http://domain.tld/page/page.html, он не может быть открыт, я получаю сообщение об ошибке в SSI, например [an error occurred while processing this directive], вместо того, чтобы открывать простую HTML-страницу, которая у меня есть на сервере. - person andrew; 14.08.2012
comment
Добавьте RewriteCond %{REQUEST_FILENAME} !-f и RewriteCond %{REQUEST_FILENAME} !-d прямо перед последним правилом перезаписи. - person Jon Lin; 14.08.2012
comment
Здорово! Правило само по себе работает сейчас. Я проверил это с другими правилами, и у меня есть один конфликт с .html правилом удаления расширений RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP/ [NC] RewriteRule ^([^.]+)\.html$ \/$1 [R=301,L] RewriteCond %{REQUEST_URI} !(\.[^./]+)$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ \/$1.html [L] В чем может быть проблема? Итак, наконец, теперь все работает. Но я хочу открыть http://domain.tld/page/page.html, введя адрес без расширения http://domain.tld/page/page - person andrew; 14.08.2012
comment
@user1586029 user1586029 понятия не имею, для чего предназначен RewriteCond %{REQUEST_URI} !(\.[^./]+)$, но это, похоже, больше не касается исходного вопроса, и размещение кода в комментариях просто выглядит тарабарщиной. Это все еще проблема с удалением htaccess только '?'sing from URL with QUERY_STRING? - person Jon Lin; 14.08.2012
comment
Так что ты прав. Я понимаю вас, что я должен задать новый вопрос. Верно? Джон, большое спасибо за помощь в удалении этого вопросительного знака из строки запроса. Я очень очень доволен результатом. Что я могу сделать для вас, чтобы выразить свою благодарность? - person andrew; 14.08.2012
comment
@user1586029 meta.stackexchange.com/ questions/5234/ Вы также должны задать новый вопрос, потому что подобные высказывания в комментариях приведут к тому, что ответ будет помечен, а новые вопросы в комментариях только усугубят ситуацию. Кроме того, задав новый вопрос, вы можете четко описать проблему, используя более 500 символов, позволяет форматировать код так, чтобы он был читабельным, и позволяет другим публиковать ответы, содержащие более 500 символов, и они могут форматировать код таким образом, чтобы это читабельно. - person Jon Lin; 14.08.2012