#apache #.htaccess #mod-rewrite
#apache #.htaccess #мод-перезапись
Вопрос:
Что я делаю прямо сейчас
Я разрабатываю серверную часть для клиента.
Ранее он перепутал данные веб-сайта с файлами для загрузки для друзей и других целей.
Пример:
/public
/somedir
somesubdirfile
anotherfile1
anotherfile2
foobar.html
index.html
Теперь я внедрил общие правила перезаписи, чтобы перенаправлять все запросы на новый index.php
веб-сайт.
.htaccess
<IfModule mod_rewrite.c>
RewriteEngine "On"
RewriteCond "%{REQUEST_FILENAME}" ".htaccess"
RewriteCond "%{REQUEST_FILENAME}" ".htpasswd"
RewriteCond "%{REQUEST_FILENAME}" "!-s"
RewriteCond "%{REQUEST_FILENAME}" "!-l"
RewriteCond "%{REQUEST_FILENAME}" "!-d"
RewriteRule "^.*$" "public/index.php" [NC,L]
</IfModule>
Отлично, работает.
Теперь я переместил весь беспорядок в отдельную папку.
/resources
/somedir
somesubdirfile
anotherfile1
anotherfile2
foobar.html
/public
index.php
Что мне нужно дополнить
… заключается в изменении правил перезаписи.
Если запрос не соответствует определенному файлу или символической ссылке в /public
нем, необходимо проверить, соответствует ли он /resources
определенному файлу или символической ссылке. Если есть совпадение 301 Moved Permanently
, необходимо отправить и перенаправить запрос /resources
. Если совпадения нет public/index.php
, необходимо выполнить перенаправление на.
Но я действительно застрял в понимании того, как писать правильные правила перезаписи в сложности, подобной моей просьбе.
Мне нужна помощь здесь, пожалуйста.
Ответ №1:
Вы можете попробовать эти правила в корне вашего сайта .htaccess:
RewriteEngine On
# if it exists in /resources then redirect
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/resources/$0 -f
RewriteRule . /resources/$0 [L,NE,R=301]
# else route to public/index.php
RewriteCond %{REQUEST_URI} .(htaccess|htpasswd) [NC]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ public/index.php [L]