【发布时间】: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