简体   繁体   中英

Can't get Symfony to work on production server

EDIT: For whoever is having the same problem, seriously, just make a sub-domain and direct it to the symfony web directory. Symfony's url rewriting system is clearly built around being on the root directory of something . Anything else isn't worth the headache.

I've been trying for the past two days to get even a fresh Symfony project to run on our server. I install the project no problem, but when I try to go to example.net/symfony/web/app_dev.php I get a 404 page not found error for my site, not for Symfony, same with app.php .

It's such a simple problem but it has caused me hours of head ache with no head way in the slightest.

I'm not doing anything fancy with our .htaccess file for our site or for the new Symfony project.

Symfony .htaccess:

# Use the front controller as index file. It serves as a fallback solution when
# every other rewrite/redirect fails (e.g. in an aliased environment without
# mod_rewrite). Additionally, this reduces the matching process for the
# start page (path "/") because otherwise Apache will apply the rewriting rules
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
DirectoryIndex app.php

# By default, Apache does not evaluate symbolic links if you did not enable this
# feature in your server configuration. Uncomment the following line if you
# install assets as symlinks or if you experience problems related to symlinks
# when compiling LESS/Sass/CoffeScript assets.
# Options FollowSymlinks

# Disabling MultiViews prevents unwanted negotiation, e.g. "/app" should not resolve
# to the front controller "/app.php" but be rewritten to "/app.php/app".
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Determine the RewriteBase automatically and set it as environment variable.
    # If you are using Apache aliases to do mass virtual hosting or installed the
    # project in a subdirectory, the base path will be prepended to allow proper
    # resolution of the app.php file and to redirect to the correct URI. It will
    # work in environments without path prefix as well, providing a safe, one-size
    # fits all solution. But as you do not need it in this case, you can comment
    # the following 2 lines to eliminate the overhead.
    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}]

    # 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 start page 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\.php(?:/(.*)|$) %{ENV:BASE}/$1 [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]

    # Rewrite all other queries to the front controller.
    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 start page to the front controller explicitly so that the website
        # and the generated links can still be used.
        RedirectMatch 302 ^/$ /app.php/
        # RedirectTemp cannot be used instead
    </IfModule>
</IfModule>

Site .htaccess:

RewriteOptions inherit

# BEGIN WPSuperCache
# END WPSuperCache

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/appone/?.*$
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/apptwo/?.*$
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/appthree/?.*$
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]

I'm getting these errors in the Apache error_log:

[Thu Jan 14 07:06:24.920671 2016] [:error] [pid 8852] [client 99.99.999.9:99999] SoftException in Application.cpp:431: Mismatch between target GID (512) and GID (20) of file "/home/user/public_html/symfony/web/app.php"
[Thu Jan 14 07:06:24.920715 2016] [core:error] [pid 8852] [client 99.99.999.9:99999] End of script output before headers: app.php
[Thu Jan 14 07:06:34.560027 2016] [:error] [pid 8503] [client 99.99.999.9:99999] SoftException in Application.cpp:431: Mismatch between target GID (512) and GID (20) of file "/home/user/public_html/symfony/web/app_dev.php"
[Thu Jan 14 07:06:34.560079 2016] [core:error] [pid 8503] [client 99.99.999.9:99999] End of script output before headers: app_dev.php
[Thu Jan 14 07:09:19.556406 2016] [:error] [pid 8852] [client 99.99.999.9:99999] SoftException in Application.cpp:422: Mismatch between target UID (501) and UID (1337) of file "/home/user/public_html/symfony/symfony_demo/web/app.php"
[Thu Jan 14 07:09:19.556452 2016] [core:error] [pid 8852] [client 99.99.999.9:99999] End of script output before headers: app.php

If you need any additional information, I'll do my best to oblige. Thank you for the assistance.

I still have too low rep to just comment, so I'll post an answer.

Your htaccess matters very little relating to 404 problems.

If you are using Debian, please go to /etc/apache2/sites-available and create a page for Symfony, like it is shown here http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html .

Make sure to define the proper symfony folder location, or it will keep returning 404 errors.

It should look something like this

<VirtualHost *:80>
    ServerName YOURDOMAINNAME.DOMAIN
    ServerAlias www.YOURDOMAINNAME.DOMAIN

    DocumentRoot FULL_SYMFONY_PATH
    <Directory FULL_SYMFONY_PATH>
        AllowOverride None
        Order Allow,Deny
        Allow from All

        <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app.php [QSA,L]
        </IfModule>
    </Directory>

    # uncomment the following lines if you install assets as symlinks
    # or run into problems when compiling LESS/Sass/CoffeScript assets
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>

This config also disables htaccess.

Name this config something YOURDOMAINNAME.conf, and afterwards input this into console a2ensite YOURDOMAINNAME.conf.

I think there were some additional steps, but I am not at my normal computer, let me know if it does not work.

Right, now I think I remember, you need to enable mod_rewrite with this line a2enmod rewrite and restart apache afterwards.

不确定是否有帮助,但是尝试将DocumentRoot更改为symfony / web目录(因此,web文件夹是站点的根目录)?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM