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

Как сделать правила перезаписи относительно файла .htaccess

Сейчас у меня есть такой файл .htaccess.

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/(always|rewrite|these|dirs)/ [NC]

RewriteRule ^(.*)$ router.php [L,QSA]

Он работает, когда файлы сайта находятся в document_root веб-сервера (т.е. domain.com/abc.php -> <DOCUMENT_ROOT>/abc.php). Но в наших текущих настройках (которые нельзя изменить) это не гарантировано. Иногда между корнем документа и папкой файла .htaccess может быть произвольная папка (т.е. domain.com/something/abc.php -> <DOCUMENT_ROOT>/something/abc.php). Проблема только в том, что это второй RewriteCond больше не работает. Есть ли способ динамически проверять, доступен ли путь по пути относительно .htaccess файл.

Например:

Если у меня есть сайт, где domain.com/prefix/ это каталог .htaccess файл.

NOT FORCED TO REWRITE -> domain.com/prefix/index.php
FORCED TO REWRITE -> domain.com/prefix/rewrite/index.php

Если у меня есть сайт, где domain.com/ это каталог .htaccess файл.

NOT FORCED TO REWRITE -> domain.com/index.php
FORCED TO REWRITE -> domain.com/rewrite/index.php

Делает Вынужден переписать означает, что правило перезаписи должно работать, даже если запрошенный файл или каталог существует?

Если да, просто старайтесь избегать создания файла / каталога.

Или разделите это на два правила:

RewriteRule ^ / (всегда | перезаписывать | эти | каталоги) / router.php [L]

RewriteCond% {REQUEST_FILENAME}! -F

RewriteCond% {REQUEST_FILENAME}! -D

RewriteRule ^ (. *) $ Router.php [L, QSA]

Решение есть, но оно не простое.

Использовать RewriteMap.

Вот как бы я поступил:

Создать RewriteMap файл. Видеть здесь для получения дополнительной информации. Это очень простой текстовый файл с: во-первых, неправильным URL без '/', затем одно пространство (по крайней мере), а затем правильный URL, например:

ok​ /folder1/
ok /folder2/
ok /folder3/

Тогда код:

RewriteMap myfoldermap \
  dbm:/web/htdocs/yourwebsite.com/rewriterules/myfoldermap.map

RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)
# Now in '%1' there's the name of the folder
# Don't touch the URL but...
# ...check if it exists in the map file
RewriteRule (.*) - [QSA,E=FOLDERMAP:${myfoldermap:%1|notfound}]

# if the environment is neither empty or not found...
RewriteCond %{E:FOLDERMAP} !^(notfound|)$
# this means we found something...
# => apply the RewriteRule
RewriteRule ^(.*)$ router.php [L,QSA]

Если не работает: прочтите мои обычные «две подсказки» и добавьте журнал перезаписи в свой вопрос.

Две подсказки:

Если вы не находитесь в размещенной среде (= если это ваш собственный сервер, и вы можете изменять виртуальные хосты, а не только .htaccess файлы) попробуйте использовать RewriteLog директива: помогает отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярного выражения:

http://www.quanetic.com/Regex (не забудьте выбрать ereg (POSIX) вместо preg (PCRE)!)

Если я вас правильно понимаю (особенно я не понимаю, что вы имеете в виду под вынужден переписать), RewriteBase для вас.

Кстати: не используйте такие вещи, как domain.com :-)