2009-11-19 3 views
0

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

Текущая структура 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?

+0

Чтобы выразить свой вопрос, я не могу получить доступ к каталогу, который существует на сервере, потому что переписывание мода меня перенаправляет. Это не должно произойти, потому что я устанавливаю RewriteCond% {REQUEST_FILENAME}! -d –

+0

Вопрос о попытке изменить второе на последнее или последнее правило из ... php? N = ... ... ... phph? M = ... чтобы узнать, какие правила действуют. ? Кроме того, как это вы говорите, это перенаправление администратора/п = админ, но вы обратитесь к index.php получения п = параметр админ –

ответ

0

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

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

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

+0

Это было бы предположить, что это будет работать: RewriteCond% {REQUEST_FILENAME} -f RewriteCond% {REQUEST_FILENAME} -d RewriteCond% {REQUEST_FILENAME}^admin (?: \ /)? $ RewriteRule^(.?) $ $ 1 [L] Но это не так? –

+0

На самом деле, это должно работать, но это не так: RewriteCond% {REQUEST_FILENAME} -f [OR] RewriteCond% {REQUEST_FILENAME} -d [OR] RewriteCond% {REQUEST_FILENAME}^админ (?: \ /)? $ RewriteRule^(.?) $ $ 1 [L] –

+0

Я по-прежнему очень уверен, что ваше первое правило никогда не будет соответствовать, поскольку вы устанавливаете его с помощью «если путь не является файлом, а путь не является каталог и путь не admin/или admin ", то если путь« admin/или admin »переписать его на«/admin/» Таким образом, нет изменений в сети, из-за предыдущего нет. –

0

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

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

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