.htaccess переписать с помощью Symfony стандартного файла .htaccess - PullRequest
0 голосов
/ 02 апреля 2020

Публикация этого в SE вместо ServerFault, поскольку он фокусируется на веб-разработке и содержит ссылки на Symfony.

У меня проблемы с созданием перезаписи .htaccess с настройкой Symfony по умолчанию. настройка htaccess. Мое намерение заключается в следующем:

  • Внутренне переписать все запросы на bla/something/* до something/else.
  • something/else не является допустимым файлом в Интернете root, а скорее URI, обрабатываемым приложением Symfony
  • , таким образом, поток запросов: сопоставить внутреннюю перезапись, повторно обработать правила с something/else (который затем переписывается - и обнаруживается приложением Symfony), таким образом обслуживая контроллер something/else, пока в URL браузера все еще отображается bla/something/x.

Я собрал следующее правило basi c, которое работает при использовании для перенаправлений 301:

RewriteRule ^bla/something/(.+)$ /something/else

, что приводит к полному .htaccess файл:

DirectoryIndex index.php

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

#   RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
#   RewriteRule ^(.*) - [E=BASE:%1]

    # Sets the HTTP_AUTHORIZATION header removed by Apache
    RewriteCond %{HTTP:Authorization} .
    RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

#    DirectoryIndex index.php
#    RewriteCond %{ENV:REDIRECT_STATUS} ^$
#    RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]

    RewriteRule ^bla/something/(.+)$  /something/else
    # If the requested filename exists, simply serve it.
    # We only want to let Apache serve files and not directories.
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ - [L]


    # Rewrite all other queries to the front controller.
#    RewriteRule ^ %{ENV:BASE}/index.php [L]
    FallbackResource /index.php
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        RedirectMatch 302 ^/$ /index.php/
    </IfModule>
</IfModule>

В идеале все, что я прокомментировал, должно быть включено и работать. Я только что попытался отогнать его до самого простого c файла. Что еще я пробовал:

  • Флаги: [PT], [L]…

  • Замена на 301 перенаправления: те работают, так что соответствие правил

  • порядок правил

Проблема, однако, в том, что запрос вообще не переписывается внутри. Браузер показывает /bla/something/x, что также видит приложение Symfony для запрошенного пути.

1 Ответ

1 голос
/ 02 апреля 2020

Браузер показывает / bla / что-то / x, это также то, что приложение Symfony видит для запрошенного пути.

Возможно, потому что Symfony принимает запрошенный URL от $_SERVER['REQUEST_URI'] - и это значение не изменяется из-за внутренней перезаписи, но все еще содержит первоначально запрошенный URL.

В идеале это должно быть обработано с помощью конфигурации маршрутизации Symfony, но если невозможно из-за отсутствия доступа, тогда потребуется другой обходной путь.

Использование mod_proxy может работать, но, вероятно, не является идеальным решением most - это означает, что сервер должен обработать дополнительный HTTP-запрос сейчас. Но если с этим у вас не возникнет заметных проблем с производительностью, то, скорее всего, так и будет.

...