Symfony: htaccess以隐藏app.php或app_dev.php。

时间:2022-05-16 11:20:23

I know this has been asked many times, but something strange is happening to me. Apache DocumentRoot is pointing to symfony/web/ and this is my .htaccess inside web/ dir:

我知道这已经被问过很多次了,但是我身上发生了一些奇怪的事情。Apache DocumentRoot指向symfony/web/,这是我在web/ dir中的.htaccess:

DirectoryIndex app_dev.php
#DirectoryIndex app.php

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^app\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]


    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^(.*)$ app_dev.php [QSA,L]
    #RewriteRule ^(.*)$ app.php [QSA,L]

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteRule .? %{ENV:BASE}app.php [L]
</IfModule>

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

Well, the thing is www.example.com/route1/ is working and www.example.com/route2/ is throwing an error:

嗯,事情是这样的:www.example.com/route1/正在工作,www.example.com/route2/正在抛出一个错误:

Oops! An Error Occurred The server returned a "404 Not Found". Something is broken. Please e-mail us at [email] and let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused.

哦!服务器返回一个“404 Not Found”错误。东西坏了。请在[电子邮件]中给我们发电子邮件,当这个错误发生时,让我们知道你在做什么。我们会尽快修好它。对造成的不便表示歉意。

While www.example.com/app_dev.php/route2/ is working ok (also www.example.com/app_dev.php/route1/)

在www.example.com/app_dev.php/route2/正在工作的时候(也可以www.example.com/app_dev.php/route1/)

Help?

帮助吗?

Update. Cache clear in prod throws this error (I never tried before, I'm working on dev):

更新。在prod中清除缓存会抛出这个错误(我以前从未尝试过,我在开发dev):

[Doctrine\Common\Proxy\Exception\UnexpectedValueException] The type hint of parameter "userRoles" in method "addRole" in class "MyProject\PanelBundle\Entity\User" is invalid.

在“MyProject\PanelBundle\Entity\User”中,在方法“addRole”中,参数“userRoles”的类型提示无效。

[ReflectionException] Class Maycol\BlogBundle\Entity\Role does not exist

[ReflectionException]类Maycol\BlogBundle\Entity\Role不存在。

2 个解决方案

#1


6  

This is the .htaccess that worked for me:

这是为我工作的。htaccess:

DirectoryIndex app.php
#DirectoryIndex app_dev.php

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Redirect to URI without front controller to prevent duplicate content
    # (with and without `/app.php`). Only do this redirect on the initial
    # rewrite by Apache and not on subsequent cycles. Otherwise we would get an
    # endless redirect loop (request -> rewrite to front controller ->
    # redirect -> request -> ...).
    # So in case you get a "too many redirects" error or you always get redirected
    # to the startpage because your Apache does not expose the REDIRECT_STATUS
    # environment variable, you have 2 choices:
    # - disable this feature by commenting the following 2 lines or
    # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
    #   following RewriteCond (best solution)
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    #RewriteRule ^app_dev\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L]
    RewriteRule ^app\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L]

    # 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]


    RewriteCond %{REQUEST_FILENAME} -f
    #RewriteRule ^(.*)$ app_dev.php [QSA,L]
    RewriteRule ^(.*)$ app.php [QSA,L]

    # The following rewrites all other queries to the front controller. The
    # condition ensures that if you are using Apache aliases to do mass virtual
    # hosting, the base path will be prepended to allow proper resolution of the
    # app.php file; it will work in non-aliased environments as well, providing
    # a safe, one-size fits all solution.
    RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    #RewriteRule .? %{ENV:BASE}app_dev.php [L]
    RewriteRule .? %{ENV:BASE}app.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        # When mod_rewrite is not available, we instruct a temporary redirect of
        # the startpage to the front controller explicitly so that the website
        # and the generated links can still be used.
        #RedirectMatch 302 ^/$ /app_dev.php/
        RedirectMatch 302 ^/$ /app.php/
        # RedirectTemp cannot be used instead
    </IfModule>
</IfModule>

#2


0  

This error is NOT Apache/htaccess related. This 404 error page is the default one of symfony itself!

这个错误不是Apache/htaccess相关的。这个404错误页面是symfony本身的默认页面!

Something is broken. Please e-mail us at [email] and let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused.

There is no route matching /route2. Check your routing like this:

没有路径匹配/路由2。像这样检查你的路由:

php app/console router:debug 

To inspect it quicker use grep or findstr ( Windows )

检查它是否更快地使用grep或findstr (Windows)

php app/console router:debug | grep route2

Please also check that your route is not only configured in the dev environment ( i.e. only in routing_dev.yml )!

还请检查您的路由不仅在dev环境中配置(也只在routing_dev中配置)。yml)!

php app/console router:debug --env=prod

please clear your prodution cache with ...

请用…

php app/console cache:clear --env=prod

... and check your log files if there is an uncaught Exception leading to the 404 page displayed when accessing the page. You can for example use this command to view the live changes in the production logfile.

…如果有未捕获的异常导致访问页面时显示的404页面,请检查日志文件。例如,您可以使用此命令查看生产日志文件中的实时更改。

tail -f app/logs/prod.log

#1


6  

This is the .htaccess that worked for me:

这是为我工作的。htaccess:

DirectoryIndex app.php
#DirectoryIndex app_dev.php

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Redirect to URI without front controller to prevent duplicate content
    # (with and without `/app.php`). Only do this redirect on the initial
    # rewrite by Apache and not on subsequent cycles. Otherwise we would get an
    # endless redirect loop (request -> rewrite to front controller ->
    # redirect -> request -> ...).
    # So in case you get a "too many redirects" error or you always get redirected
    # to the startpage because your Apache does not expose the REDIRECT_STATUS
    # environment variable, you have 2 choices:
    # - disable this feature by commenting the following 2 lines or
    # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
    #   following RewriteCond (best solution)
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    #RewriteRule ^app_dev\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L]
    RewriteRule ^app\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L]

    # 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]


    RewriteCond %{REQUEST_FILENAME} -f
    #RewriteRule ^(.*)$ app_dev.php [QSA,L]
    RewriteRule ^(.*)$ app.php [QSA,L]

    # The following rewrites all other queries to the front controller. The
    # condition ensures that if you are using Apache aliases to do mass virtual
    # hosting, the base path will be prepended to allow proper resolution of the
    # app.php file; it will work in non-aliased environments as well, providing
    # a safe, one-size fits all solution.
    RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    #RewriteRule .? %{ENV:BASE}app_dev.php [L]
    RewriteRule .? %{ENV:BASE}app.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        # When mod_rewrite is not available, we instruct a temporary redirect of
        # the startpage to the front controller explicitly so that the website
        # and the generated links can still be used.
        #RedirectMatch 302 ^/$ /app_dev.php/
        RedirectMatch 302 ^/$ /app.php/
        # RedirectTemp cannot be used instead
    </IfModule>
</IfModule>

#2


0  

This error is NOT Apache/htaccess related. This 404 error page is the default one of symfony itself!

这个错误不是Apache/htaccess相关的。这个404错误页面是symfony本身的默认页面!

Something is broken. Please e-mail us at [email] and let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused.

There is no route matching /route2. Check your routing like this:

没有路径匹配/路由2。像这样检查你的路由:

php app/console router:debug 

To inspect it quicker use grep or findstr ( Windows )

检查它是否更快地使用grep或findstr (Windows)

php app/console router:debug | grep route2

Please also check that your route is not only configured in the dev environment ( i.e. only in routing_dev.yml )!

还请检查您的路由不仅在dev环境中配置(也只在routing_dev中配置)。yml)!

php app/console router:debug --env=prod

please clear your prodution cache with ...

请用…

php app/console cache:clear --env=prod

... and check your log files if there is an uncaught Exception leading to the 404 page displayed when accessing the page. You can for example use this command to view the live changes in the production logfile.

…如果有未捕获的异常导致访问页面时显示的404页面,请检查日志文件。例如,您可以使用此命令查看生产日志文件中的实时更改。

tail -f app/logs/prod.log