Typecho的不一样的打开方式--try_files

in 日常 with 0 comment

一般我们使用nginx配置Typecho时,都会这样写:

if ( !-e $request_filename ) {
    rewrite ^(.*)$ /index.php$1 last;
}

那么,我就在想了,if又慢又不顺眼,有没有其他方法呢?
于是,我尝试了try_files大法:

try_files $document_uri /index.php/$request_filename;

完美!这样就顺眼多了!可是,当我沾沾自喜时,发现 /admin/ 打不开了
404! 404!! 404!!!
可恶,于是我一不做二不休,想想暴露登陆接口的确不好,单独开了一个端口处理
但是登陆时会自动调用 index.php 使用PATH_INFO
这使我很头疼,因为我不喜欢PATH_INFO,因此直接在nginx配置中禁用了

location ~* \.php {
    try_files        $uri =404;

方案1(成功!)

我观察了很久,发现在 admin面板中会调用 index.php/action/... 方法
登陆时自带 index.php 头,其他时候则直接跟 action/...
于是思考了一个下午,变通解决:

# PHP动态脚本
location ~* ^(.*\.php)(/.+)?$ {
    try_files        $1 =404;
    include         'fastcgi.conf';
    fastcgi_index        index.php;
    fastcgi_pass        unix:/run/php.sock;
    fastcgi_param SCRIPT_FILENAME   $document_root$1;
    fastcgi_param SCRIPT_NAME       $1;
    fastcgi_param PATH_INFO         $2;
}
# 代理
location ^~ /blog/action/{
    rewrite ^/blog(/action/.*)$ /blog/index.php$1;
}

方案2(在URL重写模式中存在问题?)

那怎么办呢?后来我经历多次失败后,使用了变通的方法,实测可行:

location ^~ /blog/index.php/ {
    add_header X-Gateway "true";
    rewrite ^/blog/index.php(.+)(\?(.*))?$ "/blog/gateway.php?$1&$2";
}

然后是GateWay,gateway.php这么写:

<?php
// PATH_INFO Gateway
// izGroup Copyright(C)
define('__FILES__',__DIR__.'/index.php');

foreach (['DOCUMENT_URI','DOCUMENT_ROOT','REQUEST_URI','SCRIPT_NAME','SCRIPT_FILENAME','PHP_SELF'] as $rep)
    $_SERVER[$rep] = str_replace(basename(__FILE__),basename(__FILES__),$_SERVER[$rep]);
$_SERVER['QUERY_STRING'] = explode('&',$_SERVER['QUERY_STRING'],2)[1];
$_SERVER['PATH_INFO'] = array_keys($_GET)[0];
    
include __FILES__;

这样就很Nice地成功了,能且只能登陆,简洁快速(前无古人后无来者)
请不要说我绕圈子,我乐意(就是欠打)。就这么简单!

Responses