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