htaccess mod_rewrite перенаправляет пути к каталогам без завершающей косой черты на PHP GET

Я создаю веб-сайт, управляемый ajax, который использует html5 pushState() для сохранения структуры URL-адреса и обеспечения надежной перезагрузки страницы и т. д. Для этого я настроил свой htaccess таким образом, что любой путь к каталогу, начинающийся с заглавной буквы и не имеет завершающей косой черты, перенаправляется на некоторые

"domain.com/index.php?page=Путь к каталогу"

Итак, сейчас мои запросы переводятся как:

domain.com/Folder => domain.com/index.php?page=Папка

domain.com/Folder/ , domain.com/folder, domain.com/folder/ => (по умолчанию, без перезаписи)

Это делается моим файлом .htaccess (расположенным в корне домена) и имеет код:

# Enable Rewriting
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^((/?[A-Z][A-Za-z0-9]*)+[^/])$
RewriteRule ^((/?[A-Z][A-Za-z0-9]*)+[^/])$ index.php?page=$1

Это работало нормально, пока я не добавил пустой каталог с именем «Папка» и не посетил «domain.com/Folder» в своем браузере.
Раньше «domain.com/Folder» давал мне ожидаемое содержимое («domain.com/ index.php?page=Folder") и "domain.com/Folder/" выдавало мне ошибку 404, как и ожидалось, поскольку в корне документа не было каталога с именем "Папка".

Теперь мой ожидаемый результат был таким:
Браузер показывает "domain.com/Folder" в адресной строке, а сервер доставляет содержимое "domain.com/index.php?page=Folder" (так же, как и в случае, когда "Folder" не существует)

Но вместо этого:
Браузер показывает "domain.com/Folder?page=Folder"

Может ли кто-нибудь указать, что я делаю неправильно здесь? И, если возможно, как я мог бы это исправить?

*У меня нет других файлов htaccess ни в каком другом каталоге.
Редактировать: схема, кажется, работает нормально, когда я форсирую постоянное перенаправление [R=301], но, к сожалению, это меняет URL-адрес в адресной строке браузера.


person Erric    schedule 26.10.2012    source источник
comment
Может кто-нибудь хотя бы просветить меня, объяснив, почему URL-адрес меняется в адресной строке браузера?   -  person Erric    schedule 27.10.2012


Ответы (2)


Наконец-то я это понял!
Головная боль была вызвана встроенной конфигурацией apache DirectorySlash, которая автоматически добавляла завершающую косую черту, если каталог существовал.
Поэтому я исправил это с помощью >выключил. Но когда я подумал об этом подробнее, я понял, что это на самом деле полезное перенаправление, поэтому я жестко закодировал свой htaccess, чтобы добавлять конечные косые черты для всех других каталогов, которые не начинаются с заглавной буквы

Итак, вот мой окончательный файл htaccess:

RewriteEngine On
DirectorySlash Off
RewriteBase /
RewriteCond %{REQUEST_URI} ^((/?[A-Z][A-Za-z0-9]*)+[^/])$ 
RewriteRule ^((/?[A-Z][A-Za-z0-9]*)+[^/])$ index.php?page=$1 [L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^([a-z0-9][A-Za-z0-9/]*[^/])$ $1/ [R,L]

Надеюсь, это может помочь другим с похожими проблемами

person Erric    schedule 27.10.2012

Вам не хватает директивы, которая будет игнорировать несуществующие файлы или папки в системе. Попробуйте добавить это в начале вашего набора правил:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Надеюсь это поможет!

person alan978    schedule 26.10.2012
comment
В этом случае он игнорирует правило перезаписи, если каталог уже существует, чего я не хотел. Правило должно перенаправлять, даже если каталог существует, если в URL-адресе нет завершающей косой черты... - person Erric; 26.10.2012