【问题标题】:.htaccess rewrite with Symfony standard .htaccess file.htaccess 用 Symfony 标准 .htaccess 文件重写
【发布时间】:2020-07-14 01:20:11
【问题描述】:

将其发布到 SE 而不是 ServerFault,因为它专注于 Web 开发并包含对 Symfony 的引用。

我在使用 Symfony 的默认 .htaccess 设置创建 .htaccess 重写时遇到问题。我的意图如下:

  • 在内部将所有对bla/something/* 的请求重写为something/else
  • something/else 不是 webroot 中的有效文件,而是 Symfony 应用程序处理的 URI
  • 请求流程因此变成:匹配内部重写,用something/else重新处理规则(然后重写-并由Symfony应用程序找到),从而在浏览器的URL仍然显示@987654327时为something/else控制器提供服务@。

我已经建立了以下适用于 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>

理想情况下,我注释掉的所有内容都应该启用并正常工作。我刚刚尝试将其提炼为最基本的文件。我还尝试了什么:

  • 标志:[PT]、[L]…

  • 替换为 301 重定向:这些有效,因此规则匹配

  • 规则顺序

但问题是,请求根本没有在内部重写。浏览器显示/bla/something/x,这也是 Symfony 应用程序看到的请求路径。

【问题讨论】:

  • “浏览器显示 /bla/something/x,这也是 Symfony 应用程序看到的请求路径。” - 这可能是因为 Symfony 从$_SERVER['REQUEST_URI'] - 该值不会因内部重写而改变,但仍包含最初请求的 URL。但无论如何,这有什么意义 - 为什么不首先在 Symfony 内部为 bla/something/* 配置正确的路由呢?
  • @CBroe 谢谢你,这已经足够好了。我用 [P] 标志解决了它,因为 mod_proxy 无论如何都是可用的。至于我为什么不使用 Symfony 重定向:它是一个第三方应用程序,我没有 对路由进行太多控制,而无需跳过一些障碍。从您的评论中,我找到了这个答案stackoverflow.com/questions/18618142/…,它帮助我解决了这个问题——现在。您能否将该评论转化为答案,以便我接受?

标签: php apache .htaccess symfony mod-rewrite


【解决方案1】:

浏览器显示 /bla/something/x,这也是 Symfony 应用程序看到的请求路径。

这可能是因为 Symfony 从 $_SERVER['REQUEST_URI'] 获取请求的 URL - 并且该值不会由于内部重写而改变,但仍然包含最初请求的 URL。

理想情况下,这应该首先通过 Symfony 路由配置来处理,但如果由于缺乏访问权限而无法做到这一点,则需要其他一些解决方法。

使用 mod_proxy 可能有效,但可能不是理想的解决方案 - 这意味着服务器现在必须处理额外的 HTTP 请求。但是,如果您没有遇到任何明显的性能问题,那么它可能会遇到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2013-04-22
    • 2017-04-08
    相关资源
    最近更新 更多