一般我们使用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地成功了,能且只能登陆,简洁快速(前无古人后无来者)
请不要说我绕圈子,我乐意(就是欠打)。就这么简单!
本文由 zlh 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。