Путаница между двумя правилами перезаписи URL-адресов

0

Вопрос

эти два правила путаются :

RewriteRule ^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$ search.php?city=$1&speciality=$2 [L] 
RewriteRule ^health-institute-app-([a-zA-Z\-]+)$ search.php?city=$1 [L]

когда я хочу достичь health-institute-app-mycity (2-е правило) сервер рассматривает app как ценность и попытаться достичь search.php?city=app&speciality=mycity (1-е правило)

как я могу сказать, что это два разных правила?

.htaccess apache mod-rewrite
2021-11-23 10:56:12
1

Лучший ответ

2

Да, потому что регулярное выражение ^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$ в первом правиле также совпадают health-institute-app-mycity.

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

Например:

RewriteRule ^health-institute-app-([a-zA-Z-]+)$ search.php?city=$1 [L]
RewriteRule ^health-institute-([a-zA-Z-]+)-([a-zA-Z-]+)$ search.php?city=$1&speciality=$2 [L] 

(Нет необходимости использовать обратную косую черту-избегайте дефиса в начале или в конце класса символов.)

ОДНАКО регулярное выражение во втором правиле (сейчас) потенциально неоднозначно, поскольку дефис (-) используется для разграничения двух значений (city и speciality), но дефис также включен в оба класса символов, поэтому он, предположительно, может быть частью самих значений. Однако и то, и другое city и speciality не могут оба содержать дефисы, несмотря на то, что регулярное выражение, по-видимому, позволяет это.

Например, как следует запрашивать health-institute-foo-bar-baz-qux быть решенным? Так как квантор + является жадным, в настоящее время это приведет к search.php?city=foo-bar-baz&speciality=qux. Если когда-либо в speciality (как предполагает регулярное выражение, это может быть так) оно никогда не будет сопоставлено.

2021-12-09 22:55:14

@narseoh На самом деле, поскольку эти значения разделены дефисом, путем включения дефиса в классы символов (т. Е. сами значения могут содержать дефис) вы вводите двусмысленность. например. Что должно health-institute-foo-bar-baz-qux решиться на это? Может ли city содержать дефисы?
MrWhite

Да, действительно, в названии некоторых городов есть дефис, а в других городах есть два слова, пробел заменен дефисом в URL-адресе
narseoh

@narseoh ХОРОШО, так что speciality никогда не содержит дефиса? (В противном случае он станет частью city.) В этом случае дефис следует удалить из speciality класс символов, чтобы устранить эту двусмысленность/путаницу, поскольку это излишне.
MrWhite

спасибо @MrWhite , на самом деле даже специальность может иметь дефис, который немного усложняет для меня ситуацию. Я подумал об этом и заменил (-) на ( / ), чтобы разделить данные, в которых говорилось, что у меня были другие проблемы (я создам еще одну тему об этом).
narseoh

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................