.htaccess mod_rewrite Упрощение правил. Можно ли упростить несколько правил для одного правила? - PullRequest
2 голосов
/ 11 марта 2020

Могу ли я объединить эти два правила (с которыми они работают нормально) в одно правило?

RewriteRule ^service/?$               service.php [NC]
RewriteRule ^service/([^/]+)/?$       service.php?id=$1 [NC]

Можно ли упростить эти 4 правила в одно?

RewriteRule ^hilfe/([^/]+)/([^/]+)/([^/]+)/?$        help/help.php?content=$1_$2_$3 [L,NC]
RewriteRule ^hilfe/([^/]+)/([^/]+)/?$                help/help.php?content=$1_$2 [L,NC]
RewriteRule ^hilfe/([^/]+)/?$                        help/help.php?content=$1 [L,NC]
RewriteRule ^hilfe/?$                                help/help.php [L,NC]

Спасибо большое много!

1 Ответ

1 голос
/ 11 марта 2020

Вы могли бы объединить этих правил в одно, хотя, является ли это "упрощением" или нет, это другой вопрос - поскольку единственное правило более сложное .

Например,

RewriteRule ^service/?$               service.php [NC]
RewriteRule ^service/([^/]+)/?$       service.php?id=$1 [NC]

Может быть представлен как:

RewriteRule ^service/?(?:([^/]+)/?)?$ service.php?id=$1 [NC]

В основном вам нужно сделать дополнительные части URL необязательными и не захватывать ( ie. (?:<regex>)?)

Обратите внимание, что параметр id присутствует всегда и поэтому может быть пустым.

RewriteRule ^hilfe/([^/]+)/([^/]+)/([^/]+)/?$        help/help.php?content=$1_$2_$3 [L,NC]
RewriteRule ^hilfe/([^/]+)/([^/]+)/?$                help/help.php?content=$1_$2 [L,NC]
RewriteRule ^hilfe/([^/]+)/?$                        help/help.php?content=$1 [L,NC]
RewriteRule ^hilfe/?$                                help/help.php [L,NC]

Может быть представлен как:

RewriteRule ^hilfe(?:/?([^/]+)(?:/?([^/]+)(?:/?([^/]+)/?)?)?)?$ help/help.php?content=$1_$2_$3 [L,NC]

Вложенность в подшаблонах, заключенных в скобки, затрудняет чтение (поддержание, отладку и т. Д. c.)

Результирующий параметр URL content URL всегда будет иметь 3 части ($1, $2 и $3), за исключением того, что они могут быть пустыми, в результате чего content=__, content=foo__, content=foo_bar_ et c.

...