Apache mod_rewrite путь сопоставления с параметрами - PullRequest
1 голос
/ 05 августа 2020

Я перехожу с IIS на Apache (на Windows) и пытаюсь адаптировать правило перезаписи (используя Helicon ISAPI_Rewrite 3 в IIS).

Правило отображает то, что выглядит как каталог путь к структуре обратно в набор параметров строки запроса. В пути может быть любое количество параметров.

Например

/ корзина / param1 / value1 / param2 / value2 / param3 / value3 ... и так далее ...

Становится ...

/ корзина? Param1 = value1¶m2 = value2¶m3 = value3 ... и так далее ...

Правило в ISAPI_Rewrite:

#  This rule simply reverts parameters that appear as folders back to standard parameters
#  e.g. /search-results/search-value/red/results/10 becomes /search-results?search-value=red&results=10

RewriteRule ^/(.*?)/([^/]*)/([^/]*)(/.+)? /$1$4?$2=$3  [NC,LP,QSA]

Сначала я заметил, что Apache не имеет флага LP, поэтому заменил его на N = 10 в качестве теста на зацикливание ...

RewriteRule ^(.*?)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,N=10,QSA]

Однако Apache журналы ошибок показывают, что одни и те же параметры добавляются снова и снова, пока не будет достигнуто количество циклов на флаге N, заканчивающееся ошибкой HTTP 500.

Есть идеи, где я ошибаюсь?!?

1 Ответ

0 голосов
/ 07 августа 2020

После того, как я много почесал голову и задействовал свой Google Foo, я нашел решение всех своих проблем в другом комментарии Stack Overflow ...

{ ссылка }

По сути ...

по-видимому, в некоторых случаях возникла проблема с повторным добавлением части post-fix mod_rewrite https://issues.apache.org/bugzilla/show_bug.cgi?id=38642

Проблема:

Если несколько RewriteRules в файле .htaccess совпадают, нежелательные копии PATH_INFO могут накапливаться в конце URI.

Если вы используете Apache 2.2.12 или новее, вы можете используйте флаг DPI, чтобы предотвратить это http://httpd.apache.org/docs/2.2/rewrite/flags.html

Я использую Apache 2.4, поэтому мое правило перезаписи теперь выглядит следующим образом (и я добавлю Флаг DPI по всем правилам для безопасности) ...

RewriteRule ^(.*?)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3  [NC,N=1000,QSA,DPI]
...