Я хочу, чтобы
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
დროშა, ამიტომ დამუშავება გრძელდება ...)
როგორც ჩანს / პროფილი / ...
არის უფრო ზოგადი გადაწერის განსაკუთრებული შემთხვევა? ასე რომ, შეგიძლიათ კონკრეტულად შეამოწმოთ პროფილი
პირველი გეზის სეგმენტში. (თუმცა ის ფაქტი, რომ ამას არ აკეთებთ, მაფიქრებინებს, რომ ამ კითხვაში კიდევ რამე არსებობს?) ამასაც პირველ რიგში უნდა მივმართოთ, ვიდრე უფრო ზოგადი დაჭერა გადავაწეროთ. მაგალითად:
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]
შაბლონის შესატყვისი ყოველთვის უნდა იყოთ მაქსიმალურად სპეციფიკური.