Несколько 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]

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

1
задан 22 December 2018 в 03:25
1 ответ
 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 დროშა, ამიტომ დამუშავება გრძელდება ...)

როგორც ჩანს / პროფილი / ... არის უფრო ზოგადი გადაწერის განსაკუთრებული შემთხვევა? ასე რომ, შეგიძლიათ კონკრეტულად შეამოწმოთ პროფილი პირველი გეზის სეგმენტში. (თუმცა ის ფაქტი, რომ ამას არ აკეთებთ, მაფიქრებინებს, რომ ამ კითხვაში კიდევ რამე არსებობს?) ამასაც პირველ რიგში უნდა მივმართოთ, ვიდრე უფრო ზოგადი დაჭერა გადავაწეროთ. მაგალითად:

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 ჰეშს, ტიპი არის უნიკალური იდენტიფიკატორი, რომელიც ყოველთვის არის სიტყვა

MD5 ჰეში არის 32 hexadecimal სტრიქონი -ასე რომ, თქვენ შეგიძლიათ ამის კონკრეტულად გადამოწმება თავიდან აიცილოთ "ტიპებთან" კონფლიქტი. მაგალითად, შეცვალეთ პირველი RewriteRule , რომ წაიკითხოთ:

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

შაბლონის შესატყვისი ყოველთვის უნდა იყოთ მაქსიმალურად სპეციფიკური.

0
ответ дан 4 December 2019 в 03:23

Теги

Похожие вопросы