Назад | Перейти на главную страницу

Несколько параметров mod_rewrite для одного и того же файла php

я хочу

site.com/home/profile

сопоставить с

site.com/index.php?view=home&type=profile

и

site.com/profile/a1b2c3

сопоставить с

site.com/index.php?view=profile&id=a1b2c3

и

site.com/profile/friends

должен соответствовать

site.com/index.php?view=profile&type=friends

а также (это уже работает, просто включая его для семантики)

site.com/profile ИЛИ site.com/home

сопоставить с

site.com/index.php?view=profile ИЛИ site.com/index.php?view=home

Вот мой .htaccess файл, расположенный в DOCUMENT_ROOT

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?view=$1&type=$2 [QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^.*\.(jpg|css|js|gif|png|bmp|svg|ico)$ [NC]
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?view=$1&id=$2 [QSA]

## This part already works, but will it interfere with my above rules?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?view=$1 [L,NC,QSA]

Что я делаю не так? Это работает только для одного или другого, но не для обоих!

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?view=$1&type=$2 [QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^.*\.(jpg|css|js|gif|png|bmp|svg|ico)$ [NC]
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?view=$1&id=$2 [QSA]

У тебя то же самое RewriteRule шаблон для обоих правил. Таким образом, первый, естественно, захватит все запросы. (Хотя вам не хватает L флаг, поэтому обработка продолжается ...)

Это выглядит как /profile/... это частный случай более общей перезаписи? Итак, вы можете специально проверить profile в первом отрезке пути. (Хотя тот факт, что вы этого не делаете, заставляет меня думать, что в этом вопросе есть что-то еще?) Это также нужно будет сделать в первую очередь, прежде чем выполнять более универсальную переписывание всего. Например:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(profile)/([^/]+)/?$ /index.php?view=$1&id=$2 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?view=$1&type=$2 [QSA,L]

Если проверка против REQUEST_URI это попытка оптимизации (чтобы избежать проверки файловой системы), то она не в том месте; это должно быть первое условие. Однако вы можете сделать это отдельной директивой (если у вас нет других директив в вашем файле). Например, перед ваши существующие директивы:

RewriteRule \.(jpg|css|js|gif|png|bmp|svg|ico)$ - [L]

Если запрошенный URL-адрес заканчивается любым из указанных расширений файла (независимо от того, отображается ли он на самом деле в существующий файл), обработка прекращается.

ОБНОВИТЬ:

Обычно id содержит хеш MD5, type - это уникальный идентификатор, который всегда является словом

Хеш MD5 представляет собой шестнадцатеричную строку из 32 символов, поэтому вы можете проверить это специально, чтобы избежать конфликтов с «типами». Например, изменить первый RewriteRule читать:

RewriteRule ^(profile)/([a-f0-9]{32})/?$ /index.php?view=$1&id=$2 [QSA,L]

При сопоставлении с образцом вы всегда должны быть максимально конкретными.