根据位置重写不同的URL

时间:2016-03-19 00:52:09

标签: nginx url-rewriting fastcgi nginx-location

我真的找不到任何关于网址重写的文档(我无法理解它,因为我意外地发现文档真的很难为非原生文件阅读)。

我正在寻找一种方法来重写与/*\.(js|png|jpg|css|ttf|xml)$/匹配path/media/的所有路线,然后尝试存在文件,如果存在则返回该文件,否则404 not found

然后,如果它以/ajax/开头,将所有内容重定向到path/ajax/index.php 否则将所有内容重定向到path/www/index.php

我不太明白应该怎么做,因为现在我创建了3个位置/ media /,/ ajax /和/ www /但我不知道这是否是正确的使用方式重写而不是返回,或者这些位置是正确的方法。

我真的不明白我在sites-enabled/file关于fastcgi所写的内容。这是解释路径吗?

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

如果我做对了,就意味着"如果它以.php结尾,并且它存在于层次结构中,那么执行它"。

而且我不知道是否应该为每个必须处理php(/ www /和/ ajax /)的位置放置那种东西,特别是因为我要做一些路由对彼此而言。而且,我不知道是否应该这样做。

1 个答案:

答案 0 :(得分:1)

最简单的PHP配置使用一个公共root指令,该指令由位置块继承,在您的情况下将是:

root path;

这意味着/www/index.php/ajax/index.php都由location ~ \.php$块处理。

默认操作可以由try_files块中的location /指令定义:

location / {
    try_files $uri $uri/ /www/index.php;
}

如果您需要对以/ajax开头的URI采用不同的默认操作,请添加更具体的位置:

location /ajax {
    try_files $uri $uri/ /ajax/index.php;
}

如果您不希望媒体URI以/media开头,则可以覆盖某个特定位置的root

location ~* \.(js|png|jpg|css|ttf|xml)$ {
    root path/media;
}

在您的特定情况下,fastcgi_split_path_infofastcgi_index指令是不必要的。 include fastcgi_params;语句应该放在任何fastcgi_param指令之前,以避免后者被无意中覆盖:

location ~ \.php$ {
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

有关详细信息,请参阅nginx documentation