Назад | Перейти на главную страницу

mod_rewrite заменить / на _

Конечно, мне здесь не хватает чего-то очевидного, но у меня есть следующее:

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ $1_$2 [N]
RewriteRule ^(.*)$ $1.php [QSA,L]

Который я бы хотел переписать / shop / basket в /shop_basket.php. Вместо этого, если я перейду в / я получаю внутреннюю ошибку сервера, и если я перейду в / магазин / корзину, он застрянет в бесконечном цикле.

Любые идеи?

Take IV: Нет, правда, вот оно!

Оказалось легче, чем я думал, избавиться от [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

Теперь это приемлемо? :-)


Дубль III: (Не очень) окончательное решение

Хорошо, после много Тестируя и ударив по клавиатуре, я наконец нашел что-то удовлетворительное. Я определенно сохраню это на случай, если по какой-то причине я когда-нибудь вернусь на 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]

Как я уже упоминал выше, самым важным было разделить две операции. Как только я это сделал, все стало намного проще. Два RewriteConds действительно удобны, потому что они позволяют вам получать доступ к файлам по их обычным именам, даже при всей этой другой перезаписи.

Я заметил, что я получал бесконечное перенаправление пути (которое Apache не мог обнаружить), например shop/basket_checkout/basket_checkout/basket/checkout; именно тогда я понял, что сам Apache добавляет пути в конец замененного пути! Таким образом [DPI] исправляет это.

Дополнительный RewriteCond во втором блоке должно быть очевидно: он предотвращает бесконечное перенаправление (т.е. если foo.php недоступен, нет смысла пытаться foo.php.php, и т.д).

Сообщите нам, как это работает для вас.


Дубль II: Хорошая попытка, но без кубиков

Ой, даже проще, чем я думал. + Изменить [N] к [C] и тебе хорошо идти. Как документация для [N] говорит:

Будьте осторожны, чтобы не создать бесконечный цикл!

Именно это и произошло здесь. ;-)
Я чуть не снял свою тестовую виртуальную машину с первой попытки - это было весело!

Однако он делает странные вещи, когда файл php на самом деле не существует. Попробую еще.