я хочу
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]
При сопоставлении с образцом вы всегда должны быть максимально конкретными.