LINUX.ORG.RU

Бьюсь головой об стену из-за .htaccess


0

0

Мучаюсь с mod_rewrite. Задача примитивная: превратить ссылки вида http://site.ru/abc/1 в http://site.ru/abc/index.php?id=1

.htaccess лежит в каталоге /abc/ и выглядит так:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /abc

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?id=$1 [L]
</IfModule>


Ну что тут не так, почему не работает? Перерыл мануалы и статьи по htaccess — там все точно так же.

В качестве параметра id передается значение "index.php", а не то, которое нужно.


Ответ на: комментарий от hooey

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^abc/(.*)$ /abc/index.php?id=$1 [QSA,L]
</IfModule>

Первый слеш лишний в правиле перезаписи.

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

Тоже не работает, 404.

Но внезапно, хвала богам ЛОРа, все прояснилось.

Вся загвоздка была в строчке RewriteCond %{REQUEST_FILENAME} !-f Так и не понял почему, правда.

Добавил ее — и все заработало. Правило: RewriteRule ^(.*)$ index.php?id=$1 [L]

Хвала, хвала Вам! Слава вечная!

hooey
() автор топика
Ответ на: комментарий от hooey

> Вся загвоздка была в строчке RewriteCond %{REQUEST_FILENAME} !-f Так и не понял почему, правда.

В этой строчке идёт проверка на то, что запрашиваемый файл не существует. Это необходимо для дого, чтобы исключить зацикливание.
Например, при запросе от браузера:
http://www.site.url/abc/12345

без проверки на существующий файл согласно правилам перезаписи произойдёт следующее:
1) меняем abc/12345 на abc/index.php?id=12345
2) меняем abc/index.php?id=12345 на abc/index.php?index.php?id=12345
3) меняем abc/index.php?index.php?id=12345 на ...

То есть Rewrite входит в рекурсию. Чтобы этого не поизошло, добавляется дополнительное правило перезаписи: "переписать при условии, что запрашиваемого файла нет". Как только "запрашиваемый файл есть", правило перестаёт отрабатывать, соответственно, апач продолжает работу дальше и обращается к существующему файлу abc/index.php

Можно обойтись без "RewriteCond %{REQUEST_FILENAME} !-f". Например, если параметр id всегда должен быть целым числом, то можно просто записать:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^abc/(\d+)$ /abc/index.php?id=$1 [QSA,L]
</IfModule>

То есть под правило перезаписи попадут все запросы:
http://www.site.url/abc/12345
http://www.site.url/abc/0
http://www.site.url/abc/3333
и т.д.

Но не попадут:
http://www.site.url/abc/asasa
http://www.site.url/abc/someRealFile.html
http://www.site.url/abc/12f22
http://www.site.url/abc/12h66
и т.д.

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

неужели
RewriteCond %{REQUEST_FILENAME} !-f
нужно для каждого RewriteRule делать?

fMad ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.