Как удалить знак ?
из URL-адреса с помощью строки запроса
htaccess удалить только '?' знак из URL со строкой запроса
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
Не работает. Я получаю внутреннюю ошибку сервера после применения строки: RewriteRule ^/?$ /%1 [L]
- person andrew; 09.08.2012
@user1586029 user1586029 Извините, я забыл
?
в конце цели правила
- person Jon Lin; 09.08.2012
Ммм, я очень ценю твои усилия для меня. Но, кажется, результаты все еще не так велики. Если я наберу mysite.com?page в поле адреса браузера, я попаду под Chrome, Firefox и IE mysite.com/?page, так что тот же вопросительный знак все еще там. Opera дает мне mysite.compage, Safari дает test.metal.by/page Не могу понять, в чем тут проблема.
- person andrew; 09.08.2012
@user1586029 user1586029 Есть две вещи, которые можно иметь в виду, когда говорят, что у меня есть этот URL, я хочу этот URL. Обычно это означает, что у вас есть какой-то URL-адрес, который вы генерируете, и его необходимо переписать внутренне во что-то, что может обрабатывать красивые URL-адреса. Если вы хотите перенаправить браузер (физически изменить то, что написано в адресной строке URL), то это совсем другое дело. Я отредактировал ответ, чтобы включить это. См. объяснение здесь: stackoverflow.com/a/11711948/851273
- person Jon Lin; 09.08.2012
Спасибо за ссылку. Это было полезно. Я прочитал его и понял код. Пожалуйста, взгляните на это и исправьте то, что я сделал неправильно. Кажется, код в основном работает, но мой сервер теперь не получает значение строки запроса. Пожалуйста, посмотрите еще раз на первый пост. Я отредактировал это и попытался подробно описать ситуацию в соответствии с обновленными условиями. Также, пожалуйста, не могли бы вы объяснить мне, что означают [A-Z]{3,9}\ и ([^\ ]+) сами по себе? Где я могу прочитать о строительстве такого типа конструкций?
- person andrew; 11.08.2012
@user1586029 user1586029 Пожалуйста, посмотрите мое редактирование, в моих правилах была ошибка, попробуйте еще раз, а также посмотрите объяснение
- person Jon Lin; 11.08.2012
Кажется, что строка
RewriteRule ^/?(.*)$ /?$1 [L]
дает внутреннюю ошибку сервера. Потому что, если я прокомментирую, эта ошибка исчезнет. Я думаю, проблема в косой черте здесь ^/?(.*)$
. Но с другой стороны правило без косой черты не работает.
- person andrew; 14.08.2012
@user1586029 user1586029 Да, это
(.*)
должно быть (.+)
- person Jon Lin; 14.08.2012
Потрясающий! Теперь это работает со строкой запроса, по крайней мере, во всех браузерах. Но появляются небольшие проблемы. Сначала посмотрите, у меня есть простой тестовый тег
<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
Добавьте
RewriteCond %{REQUEST_FILENAME} !-f
и RewriteCond %{REQUEST_FILENAME} !-d
прямо перед последним правилом перезаписи.
- person Jon Lin; 14.08.2012
Здорово! Правило само по себе работает сейчас. Я проверил это с другими правилами, и у меня есть один конфликт с
.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
@user1586029 user1586029 понятия не имею, для чего предназначен
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
, но это, похоже, больше не касается исходного вопроса, и размещение кода в комментариях просто выглядит тарабарщиной. Это все еще проблема с удалением htaccess только '?'sing from URL with QUERY_STRING?
- person Jon Lin; 14.08.2012
Так что ты прав. Я понимаю вас, что я должен задать новый вопрос. Верно? Джон, большое спасибо за помощь в удалении этого вопросительного знака из строки запроса. Я очень очень доволен результатом. Что я могу сделать для вас, чтобы выразить свою благодарность?
- person andrew; 14.08.2012
@user1586029 meta.stackexchange.com/ questions/5234/ Вы также должны задать новый вопрос, потому что подобные высказывания в комментариях приведут к тому, что ответ будет помечен, а новые вопросы в комментариях только усугубят ситуацию. Кроме того, задав новый вопрос, вы можете четко описать проблему, используя более 500 символов, позволяет форматировать код так, чтобы он был читабельным, и позволяет другим публиковать ответы, содержащие более 500 символов, и они могут форматировать код таким образом, чтобы это читабельно.
- person Jon Lin; 14.08.2012