htaccess 中的 Apache RewriteRule - 路由已损坏

Posted

技术标签:

【中文标题】htaccess 中的 Apache RewriteRule - 路由已损坏【英文标题】:Apache RewriteRule in htaccess - Routes are broken 【发布时间】:2018-06-22 19:09:54 【问题描述】:

我有一个简单的结构:

Root
|-- [app] (Symfony Application)
|    |-- [app]
|    |-- [bin]
|    |-- [src]
|    |-- [vendor]
|    |-- [web]
|         |-- .htaccess (Symfony htaccess)
|
|-- [wp-admin]
|-- [wp-content]
|-- [wp-include]
|-- .htaccess (Root htaccess)

我需要以下映射:

http://example.com      ==> Wordpress 
http://example.com/app  ==> Symfony Application

这就是我所拥有的:

根 htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^app(.*)$ app/web/$1 [L,QSA]
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule . /index.php [L]
</IfModule>

Symfony htaccess:

DirectoryIndex app.php

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

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %REQUEST_URI::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteCond %HTTP:Authorization .
    RewriteRule ^ - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
    RewriteCond %ENV:REDIRECT_STATUS ^$
    RewriteRule ^app\.php(?:/(.*)|$) %ENV:BASE/$1 [R=301,L]
    RewriteCond %REQUEST_FILENAME -f
    RewriteRule ^ - [L]
    RewriteRule ^ %ENV:BASE/app.php [L]
</IfModule>

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

问题:

问题是,Symfony 路由没有解决:

找不到“GET /”的路由

有什么简单的解决办法吗?

【问题讨论】:

您可以更改的内容是否有任何限制?例如,如果网络托管服务提供商不给您 SSH 访问权限或不允许更改底层 Apache 配置或模块,或者您不能更改项目的目录结构? 我没有 shell 访问权限。我在 url 中有一个带有 /web 的解决方案,但我想用一个简单的解决方案来摆脱它。我不想破坏 Symfony 的目录结构 如果您至少有某种管理工具,您也许可以将子域指向 web 文件夹? 【参考方案1】:

此解决方案需要 ssh 访问权限。

放弃所有基于 htaccess 规则的解决方案。尝试使用符号链接代替 ln -s 命令

这里最好的办法是将每个项目放在您的域指向的单独文件夹 otuside 文件夹中(我们在这里将其命名为 public_html

ROOT
|
-[Symfony]
-[WP]
-[public_html] (folder where your domain is pointing) 

现在 - 删除 public_html - 添加符号链接到 wp(公共 html 的名称) - 包括 wp 创建到 symfony/web 的符号链接

ROOT
|
-[Symfony]
-[WP]
-- [app]  (symbolic link to symfony/web)
-[public_html] (symbolic link to WP ) 

作为替代方案,我认为可能是将请求从 symfony 重定向到 wp,然后将 wp 响应推送给用户(来自 symfony)。我见过这样的解决方案(当您在旧系统之上构建新应用程序时使用它)。但这比符号链接更有问题(你可以在这里看到这个想法https://www.enotogorsk.ru/en/2014/07/22/symfony-legacy-bridge/)

【讨论】:

请清楚地使用标准目录结构(如我的)。我不明白你的符号

以上是关于htaccess 中的 Apache RewriteRule - 路由已损坏的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess用于Wordpress子文件夹中的Codeigniter

如果 url 包含使用 htaccess 的特定字符串,则重定向

Apache 重写到新文件夹不起作用(适用于现有文件夹)

使用 .htaccess 将 http 重定向到 https 时,某些 url 出现奇怪的 401 错误

XAMPP/Apache 文件夹中的 .htaccess 未找到错误 404

htaccess 中的 Apache RewriteRule - 路由已损坏