В настоящее время у меня есть такой файл .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:-)