Конечно, мне здесь не хватает чего-то очевидного, но у меня есть следующее:
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ $1_$2 [N]
RewriteRule ^(.*)$ $1.php [QSA,L]
Который я бы хотел переписать / shop / basket в /shop_basket.php. Вместо этого, если я перейду в / я получаю внутреннюю ошибку сервера, и если я перейду в / магазин / корзину, он застрянет в бесконечном цикле.
Любые идеи?
Оказалось легче, чем я думал, избавиться от [DPI]
. Финальный набор:
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ $1_$2 [L]
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(.*)$ $1.php
Теперь это приемлемо? :-)
Хорошо, после много Тестируя и ударив по клавиатуре, я наконец нашел что-то удовлетворительное. Я определенно сохраню это на случай, если по какой-то причине я когда-нибудь вернусь на Apache.
Лампочка погасла в моей голове, когда я разбил проблему на две части: заменить /
с участием _
; затем добавьте .php
в самом конце. Вот что я наконец придумал:
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ $1_$2 [DPI,N]
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(.*)$ $1.php [QSA]
Как я уже упоминал выше, самым важным было разделить две операции. Как только я это сделал, все стало намного проще. Два RewriteCond
s действительно удобны, потому что они позволяют вам получать доступ к файлам по их обычным именам, даже при всей этой другой перезаписи.
Я заметил, что я получал бесконечное перенаправление пути (которое Apache не мог обнаружить), например shop/basket_checkout/basket_checkout/basket/checkout
; именно тогда я понял, что сам Apache добавляет пути в конец замененного пути! Таким образом [DPI]
исправляет это.
Дополнительный RewriteCond
во втором блоке должно быть очевидно: он предотвращает бесконечное перенаправление (т.е. если foo.php
недоступен, нет смысла пытаться foo.php.php
, и т.д).
Сообщите нам, как это работает для вас.
Ой, даже проще, чем я думал. + Изменить [N]
к [C]
и тебе хорошо идти. Как документация для [N]
говорит:
Будьте осторожны, чтобы не создать бесконечный цикл!
Именно это и произошло здесь. ;-)
Я чуть не снял свою тестовую виртуальную машину с первой попытки - это было весело!
Однако он делает странные вещи, когда файл php на самом деле не существует. Попробую еще.