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

Как создать правила перезаписи относительно файла .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). Но в нашей текущей настройке (которая неизменяема) это не гарантируется. Иногда у нас может быть произвольная папка между document root и папкой файла .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

решение1

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

Использовать 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)!)

решение2

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

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

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

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

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

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

решение3

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

КСТАТИ:не используйте такие вещи, какдомен.com:-)

Связанный контент