Apache ModRewrite правила для контроллера интерфейса и «301 постоянно перемещен`

#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]