косая черта (/) в GET-запросе и мой оператор mod_rewrite в htaccess - PullRequest
0 голосов
/ 05 ноября 2018

Я немного схожу с ума по этой теме и надеюсь найти помощь.

В настоящее время я перестраиваю свой веб-сайт в структуру MVC. Это включает в себя также SEO-дружественные (красивые) URL.

Я уже добился преобразования моих URL-запросов

from: http://www.example.com/company?id=about_us
  to: http://www.example.com/company/about_us 

мой .htaccess-файл

RewriteEngine On
RewriteBase /

# Transforms an ugly-URL into a pretty-URL ('external redirect' updates also adress in browser)
#    ugly URL: www.example.com/company?id=about_us
#  pretty URL: www.example.com/company/about_us

RewriteCond %{QUERY_STRING} ^id=([\w-]+)$
RewriteRule ^(.+)$ $1/%1? [R=301,L]

# Transform an pretty-URL into a ugly-URL ('internal redirect')
#  pretty URL: www.example.com/company/about_us
#    ugly URL: www.example.com/index.php?url=company/about_us

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Теперь в игру входит GET-запрос формы (поле выбора для некоторых статей), который не работает с вышеупомянутым htaccess-файлом. В то время как каждая статья имеет SEO_slug, сохраненный в базе данных, который динамически помещается в форму. SEO-слаг уже имеет такой формат:

"<city>/<type>/<articlename>"

HTML выглядит так:

<form method='get' action='../articles/'>
  <select name='id'>
     <option value='london/fruit/article_1' >Article 1</option>
     <option value='london/nuts/article_2'  >Article 2</option>
     <option value='newyork/fruit/article_3'>Article 3</option>
     <option value='newyork/nuts/article_4' >Article 4</option>
     <option value='miami/fruits/article_5' >Article 5</option>
  </select>
</form>

Проблема:

Теперь запрос отправляется на сервер, но косая черта (/) преобразуется в «% 2f», что при моем текущем htaccess приводит к внутренней ошибке сервера.

Вопросы

1) Можно ли предотвратить преобразование из косой черты (/) в «% 2f»?

2) Как мне обновить мой mod_rewrite, чтобы включить это. Я видел так много веб-сайтов, но я так и не нашел хорошего решения. Я был способен немного достичь с этим:

RewriteCond %{QUERY_STRING} ^id=([\w-]+)(%2F*)(.*)(%2F*)(.*)$
RewriteRule ^(.+)$ $1/%1/%3/%5? [R=301,L]

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

Кто-нибудь может дать мне хороший совет? Большое спасибо! Может быть, я пытаюсь решить историю не с того конца, и мне нужно думать совершенно иначе ??

Приветствие Тим

1 Ответ

0 голосов
/ 06 ноября 2018

Finallay Я нашел решение, которым хотел бы поделиться с вами:

RewriteEngine On
RewriteBase /

# Transforms an ugly-URL into a pretty-URL ('external redirect' updates also adress in browser)
#    ugly URL: www.example.com/company?id=about_us
#  pretty URL: www.example.com/company/about_us
#
# REMARK: The important group is the thrid. The two first groups are
#         important if the query string contains slahes (/) that are
#         encoded as '%2F'. As there is no 'replace'-function each
#         Level of '%2F' needs to be rewritten step by step

RewriteCond %{QUERY_STRING} ^id=([\w-]+)%2F([\w-]+)%2F([\w-]+)$
RewriteRule ^(.+)$ $1/%1/%2/%3? [R=301,L]

RewriteCond %{QUERY_STRING} ^id=([\w-]+)%2F([\w-]+)$
RewriteRule ^(.+)$ $1/%1/%2? [R=301,L]

RewriteCond %{QUERY_STRING} ^id=([\w-]+)$
RewriteRule ^(.+)$ $1/%1? [R=301,L]

# Transform an pretty-URL into a ugly-URL ('internal redirect')
#  pretty URL: www.example.com/company/about_us
#    ugly URL: www.example.com/index.php?url=company/about_us

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Если у вас есть какие-либо комментарии по этому поводу, я рад это услышать.

...