Hostinger共享主机部署Symfony 6:.htaccess重定向public目录失败求助
在Hostinger共享主机部署Symfony 6时的.htaccess重定向问题
我在Hostinger共享主机上部署Symfony 6应用,主机根目录是public_html,服务商告知无法手动修改根目录,需通过配置.htaccess将请求重定向至public目录,但配置后并未生效,域名dijeesco.com.co无法正常访问。
public_html目录下的.htaccess原内容
#RewriteCond %{REQUEST_URI} !^/public/ #RewriteRule ^(.*)$ /public/$1 [L] <IfModule mod_rewrite.c > RewriteEngine on RewriteOptions inherit # SSL and let's encrypt RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/.+$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteRule ^.well-known/acme-challenge - [L] # redirect to no-www RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L] # https redirect RewriteCond %{HTTPS} !=on RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # redirect all requests to public directory RewriteCond %{REQUEST_URI} !public/ RewriteRule (.*) /public/$1 [L] </IfModule>
public目录下的.htaccess原内容
RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} !on RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 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 index.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. "/index" should not resolve # to the front controller "/index.php" but be rewritten to "/index.php/index". <IfModule mod_negotiation.c> Options -MultiViews </IfModule> <IfModule mod_rewrite.c> # This Option needs to be enabled for RewriteRule, otherwise it will show an error like # 'Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden' Options +FollowSymlinks 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 index.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}::$0 ^(/.+)/(.*)::\2$ RewriteRule .* - [E=BASE:%1] # Sets the HTTP_AUTHORIZATION header removed by Apache RewriteCond %{HTTP:Authorization} .+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] # Redirect to URI without front controller to prevent duplicate content # (with and without `/index.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 ^index\.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. # Rewrite all other queries to the front controller. RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ %{ENV:BASE}/index.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 307 ^/$ /index.php/ # RedirectTemp cannot be used instead </IfModule> </IfModule>
修复方案
1. 优化public_html下的.htaccess
合并规则避免冲突,确保ACME验证路径正常,统一处理HTTPS和www跳转:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 保留ACME验证路径,不做重定向 RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/ [OR] RewriteCond %{REQUEST_URI} ^/\.well-known/pki-validation/ RewriteRule ^ - [L] # 跳转至无www的HTTPS地址 RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC,OR] RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%1/$1 [R=301,L] # 所有请求重定向至public目录,排除已在public下的请求 RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(.*)$ public/$1 [L] </IfModule>
去掉
RewriteOptions inherit避免上层配置冲突,将绝对路径/public/$1改为相对路径public/$1适配Hostinger环境。
2. 调整public目录下的.htaccess
删除重复的HTTPS重定向规则,防止循环跳转:
# 移除原有的HTTPS重定向规则(已在根目录统一处理) # RewriteCond %{HTTP:X-Forwarded-Proto} !https # RewriteCond %{HTTPS} !on # RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 保留Symfony核心配置 DirectoryIndex index.php <IfModule mod_negotiation.c> Options -MultiViews </IfModule> <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On # 自动设置RewriteBase RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$ RewriteRule .* - [E=BASE:%1] # 保留HTTP_AUTHORIZATION头 RewriteCond %{HTTP:Authorization} .+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] # 若出现循环跳转,可注释以下两行index.php重定向规则 # RewriteCond %{ENV:REDIRECT_STATUS} ="" # RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] # 静态文件直接返回,其余请求转发至index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ %{ENV:BASE}/index.php [L] </IfModule> <IfModule !mod_rewrite.c> <IfModule mod_alias.c> RedirectMatch 307 ^/$ /index.php/ </IfModule> </IfModule>
3. 额外检查项
- 确认Hostinger主机已启用
mod_rewrite(共享主机默认开启,若未开启可联系客服) - 清除浏览器缓存(301重定向会被缓存,之前的错误配置可能遗留问题)
- 修改Symfony的
.env文件,设置APP_ENV=prod、APP_URL=https://dijeesco.com.co - 运行生产环境缓存命令:
composer dump-env prod和php bin/console cache:clear --env=prod
内容的提问来源于stack exchange,提问作者Juani08224
相关产品推荐
相关产品推荐

