我试图配置nginx来为一个symfony项目提供多个版本。
发布文件夹结构:
在/ var / WWW /我的项目/发行/ 24 /
在/ var / WWW /我的项目/发行/ 46 /
/ var / www / my-project / releases / 47 /
我想调用类似" http://my-server/my-project/release/47"的网址。 wich shuold访问服务器上的/var/www/my-project/releases/47/web/app.php。
我现在尝试了一段时间,但无法找到最终解决方案,任何帮助都会很棒!
我的最后一次尝试:
server {
server_name my-server;
location / {
# try to serve file directly, fallback to app.php
try_files $uri $uri$2app.php$is_args$args;
}
location ~ /my-project/release/([-a-zA-Z0-9]+)/app\.php(/|$) {
root /var/www/my-project/releases/$1/web;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/app.php;
fastcgi_param HTTPS off;
error_log /var/log/nginx/my-project_$1_error.log;
access_log /var/log/nginx/my-project_$1_access.log;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/app.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
}
此配置会产生以下错误:
[error] 2272#0:* 169重写或内部重定向循环,同时内部重定向到" /my-project/release/47app.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp。 phpapp.phpapp.php"
答案 0 :(得分:0)
您的<?php
$user_id =$fgmembersite->UserID();
$db_host = 'localhost';
$db_name= 'site';
$db_table2= 'tablesite';
$db_user = 'root';
$db_pass = '';
$con2 = mysql_connect($db_host,$db_user,$db_pass) or die("خطا در اتصال به پايگاه داده");
$selected=mysql_select_db($db_name, $con2) or die("خطا در انتخاب پايگاه داده");
mysql_query("SET CHARACTER SET utf8");
$dbresult=mysql_query("SELECT *
FROM $db_table2 WHERE id_user != '$user_id'",$con2);
echo'* نام کاربری که به او خدمت داده اید: ','<br/>';
echo '<select name="users" dir="rtl">';
while($amch=mysql_fetch_assoc($dbresult))
{
echo '<option value="'.$amch['id_user'].'">'.$amch['username'].'</option>';
}
echo '</select>'; ?><br/>
容器中缺少root
指令 - 架构上的默认值是server
吗?否则,添加一个root指令:
/var/www
root /var/www;
无法找到匹配项,并会通过向其附加try_files
来重写该网址。生成的URL与您的其他位置块不匹配,因此会一次又一次地重写。
app.php
指令的最后一个词是错误的。您有try_files
$2
应该在哪里(可能是从之前的实验继承而来)。
使用/web/
进行常规重写是一个坏主意,因为任何输入错误的URL都可能导致重写循环。尝试:
try_files
答案 1 :(得分:0)
我将配置更改为:
server {
server_name my-server;
root /var/www;
location / {
rewrite ^(/my-project/release/[-a-zA-Z0-9]+)$ $1/app.php;
}
location ~ /my-project/release/([-a-zA-Z0-9]+)/app\.php(/|$) {
alias /var/www/my-project/releases/$1/web;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/app.php;
fastcgi_param HTTPS off;
error_log /var/www/my-project/releases/$1/app/logs/nginx_error.log;
access_log /var/www/my-project/releases/$1/app/logs/nginx_access.log;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/app.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
}
现在打电话给&#34; http://my-server/my-project/release/47&#34;正确指向&#34; /var/www/my-project/releases/47/web/app.php"。
现在的问题是网址&#34; my-project / release / 47&#34;到达symfony路由器,无法找到到此URL的路由。
现在什么是保持网址显示的正确方法,例如&#34; // my-server / my-project / release / 47&#34;在浏览器,但到达symfony为&#34; // my-server /&#34;?
答案 2 :(得分:0)
谢谢大家的帮助,不幸的是我无法让它发挥作用。我想我必须先了解更多关于nginx配置才能处理这些问题,然后才能在生产中使用它。
我的解决方法是为每个版本创建一个自己的nginx conf。该文件将在构建过程中创建,然后转移到网络服务器,复制到/etc/nginx/conf.d/[releasename].conf
并由sudo service nginx reload
激活。
发布目录中的卸载脚本会在不再需要发布时删除源和配置。