【问题标题】:routing and module in symfony 1.4symfony 1.4 中的路由和模块
【发布时间】:2013-04-25 14:35:49
【问题描述】:

我在 symfony 1.4 的路由和环境或模块方面有一个严重的问题,所以我创建了三个模块 frontend , mobile 和 backend。

所以在前端和移动模块中,我使用几乎相同的路由:

//apps/frontend/config/routing.yml

home:
 url:   /home
 param: { module: user, action: home }

homepage:
 url:   /
 param: { module: content, action: index } 

  ....

default_index:
 url:   /:module
 param: { action: index }

default:
 url:   /:module/:action/*

移动模块:

//apps/mobile/config/routing.yml

home:
 url:   /home
 param: { module: user, action: home }

homepage:
 url:   /
 param: { module: sfGuardAuth, action: signin } 

  ....

default_index:
 url:   /:module
 param: { action: index }

default:
 url:   /:module/:action/*

我使用该链接访问我的网站

mysite.com/  ==> frontend module(frontend.php)
mysite.com/mobile.php ==> mobile module(mobile.php)

问题是当我正确访问移动版登录页面但登录后他们将我重定向到前端模块的主页而不是移动模块的主页?

备注:

当我将此链接mysite.com/mobile_dev.php 与 dev env 一起使用时,移动版本运行良好!

编辑:

这是我的 htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
RewriteRule ^(.*) $1? [L]
</IfModule>

Options +FollowSymLinks +ExecCGI

 <IfModule mod_rewrite.c>
 RewriteEngine On

 # uncomment the following line, if you are having trouble
 # getting no_script_name to work
 RewriteBase /

# we skip all files with .something
#RewriteCond %{REQUEST_URI} \..+$
#RewriteCond %{REQUEST_URI} !\.html$
#RewriteRule .* - [L]

# we check if the .html version is here (caching)
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f

# no, so we redirect to our front web controller
RewriteRule ^(.*)$ index.php [QSA,L]

</IfModule>

所以当我将index.php 更改为mobile.php 时,链接mysite.com/mobile.php直接转到移动版主页,一切正常...

所以我现在的问题是如何编辑我的 .htaccess 以像这样重定向我:

mysite.com/index.php or mysite.com/  redirect me to my site 
mysite.com/mobile.php redirect me to mobile version

编辑2:

我向你解释一下,当我从这个链接开始时 mysite.com/mobile.php 所以它会将我重定向到移动应用程序以登录页面但是当登录后它转到我的主页新请求搜索默认前端控制器并指向 index.php所以给我前端应用的主页,而不是移动应用!

那么为什么带有mobile_dev.php 的symfony 会一直记住我们在移动开发环境中,而使用mobile.phpit 在第一次重定向时将我从prod mobile env 切换到frontend prod env?

【问题讨论】:

  • 您应该检查所有settings.yml中是否只有一个no_script_name: true
  • 是的,在前端和移动端它们都是 no_script_name:在所有 settings.yml 中都是 true,这意味着?
  • 这意味着配置不正确...您应该阅读链接文档。

标签: .htaccess symfony1 symfony-1.4 subdomain


【解决方案1】:

登录成功后,sfGaurdModule 重定向到路由homepage。您在两个应用程序中的homepage 路由都有一个定义为/ 的URL。因此,当您登录到frontendmobile 时,您将被重定向到http://mysite.com/

由于一个 URL 只能描述一种资源,因此您的 Web 服务器在获取 URL http://mysite.com/ 时无法理解您要使用的应用程序。它查看 .htaccess 并发现它应该将此 URL 视为引用 http://mysite.com/index.php(前端应用程序)。这就是为什么你总是被重定向到前端。

您无法使用 .htaccess 对其进行更改,因为您永远无法仅区分 URL http://mysite.com/

你可以做的是:

  • 或者将移动应用主页的 URL 更改为例如/mobile_home 并将no_script_name 切换为false 用于移动应用

  • 或者覆盖sfGuardAuth模块的signin()函数,让它根据你现在使用的应用重定向到不同的页面。

无论哪种方式,请记住在您的某个应用中将no_script_name 设置为false,因为如果您不这样做,它总是会导致问题。

至于dev 环境。它之所以有效,是因为在登录 dev 后,您永远不会重定向到 /,而是重定向到 frontend_dev.phpmobile_dev.php,因此服务器不会感到困惑。

【讨论】:

    【解决方案2】:

    注意,no_script_name: true 不能使用 2 次(对于您的前端和移动应用),如果它在同一个域/子域上,则只能使用一次!

    【讨论】:

    • 好的,我从移动设备中删除 no_script_name: true 并将其保留在前端,它不起作用我有同样的问题...
    • 解决方案不存在,每次调用mobile.php....时都必须使用htaccess重定向我们。
    • 所以我看不出问题出在哪里。但我认为您不需要编辑 .htaccess 文件来执行此操作。
    【解决方案3】:

    您可能想查看relative_url_root,我对此也有疑问:Symfony does not detect relative url root

    【讨论】:

    • 我没有得到你的解决方案,我在我的 htaccess 中添加了RewriteCond %{REQUEST_URI} ^/mobile/? RewriteRule ^(.*)$ mobile.php [QSA,L],它只在本地服务器上工作,但在网上它不是......
    【解决方案4】:

    如果您使用 sfGuardPluginsfDoctrineGuardPlugin,您必须检查插件代码以修改重定向行为。 sf 1.4 对多应用程序的支持很差。只是为了澄清您已经创建了三个“应用程序”,而不是您所说的三个“模块”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多