Мод переписать игнорируя -d - PullRequest
0 голосов
/ 19 ноября 2009

Через день или два я все еще сражаюсь с Mod Rewrite. Кажется, что 60% моего времени на разработку тратится на борьбу с сервером.

Моя текущая структура URL такова, что все http://example.com/xyz и http://example.com/xyz/abc должны обрабатываться index.php. Проблема в том, что у меня есть раздел http://example.com/admin/, который является реальным каталогом , который мне нужен для доступа через HTTP-запрос (это каталог CMS)

Когда я пытаюсь перейти к CMS http://example.com/admin/, Он меняет мой URL-адрес на http://example.com/admin/?n=admin и возвращает 404. Мой index.php получает n = admin в качестве аргумента.

Я не могу понять, почему эти два условия игнорируются:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !^admin(?:\/)?$

И почему я получаю перенаправление на http://example.com/admin/?n=admin (вместо того, чтобы просто остановиться на http://example.com/admin/.

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !^admin(?:\/)?$

# allow access to certain subdirectories.
RewriteRule ^admin(?:\/)?$ /admin/ [L,NC]

# redirect all old URLs to new pages (or 404 sitemap page if no analog?).
RewriteRule ^company/about(?:\/)?$ /company [R=301,L,NC]

# catch any others and try to serve them right
RewriteRule ^/?(.+).html$ /$1 [R=301,L]

RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$2 [L]

Может кто-нибудь предложить какие-либо идеи или указать на какие-либо недостатки в .htaccess?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2009

Попробуйте это правило перед другими вашими правилами:

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

Это завершит процесс перезаписи, если запрошенный путь может быть сопоставлен с существующим каталогом. То же самое относится и к использованию -f.

0 голосов
/ 19 ноября 2009

Каждый RewriteCond применяет только следующий RewriteRule.

так что только ваше первое правило имеет условие.

Вы можете повторить правила или сделать окончательный и выходящий (не могу вспомнить для этого флажок)

...