Это сложилось быть легче, чем я думавший избавиться от [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
Теперь действительно ли это приемлемо?:-)
Хорошо, после большого тестирования и banging-head-on клавиатуры, я наконец придумал что-то удовлетворительное. Я определенно сохраняю этого в случае, если я когда-либо переключаюсь назад на 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]
говорит:
Бойтесь создавать бесконечный цикл!
Который является точно, что произошло здесь.;-)
Я почти удалил свой тест VM на первой попытке - который был забавой!
Это делает странные вещи, тем не менее, когда php файл на самом деле не существует. Я протестирую еще немного.
Быстрый поиск в Google дал это сообщение MSDN , которое также ссылается на эту статью базы знаний , которая совпадает с сообщением об ошибке.
Похоже, вам нужно внести некоторые правки в реестр в Perflib.