apache默认对进行了编码的url 返回 404

我们通常使用 urlencode()之类的函数将斜线编码成%开头的字符串

但是默认情况下

apache发现请求的URL中有对斜线的编码后的字符,是会返回404页面的

此时,就用到了 AllowEncodedSlashes on 指令允许请求继续被处理

如果apache配置的https,那么http和https需要分别配置。

我用的apache是 Apache/2.4.6 (CentOS)

http的配置文件和ssl配置文件是分开的。

在httpd.conf 中直接在文件中增加 AllowEncodedSlashes On

重启就生效了,而https 直接放到配置ssl.conf中是没有生效。后来查到是放到 这个标签里边。

重启后终于生效。

未分类

[Flask教程] 1.第一个Flask程序、DEBUG模式及URL传参

–引言请见我的简书https://www.jianshu.com/p/e27…

我们打开PyCharm,新建一个Project,在左侧选择Flask,右侧Location可选择项目存放的位置,Project Interpreter选择使用的编译器,我们当然可以选择已经安装在电脑上的python 3.6,但我建议选择使用Virtualenv来建立一个虚拟的环境,这样在虚拟环境里安装包之类的,不会影响电脑上本身已经装的,并且后续如果项目较多的话也便于区分和管理。

未分类

点击Create,创建好之后,pycharm自动在项目的文件夹下建立了static/templates文件夹和HarpQA.py,此外还有一个venv文件夹,是虚拟环境用的,我们可以暂时不用管它。(如果你的PyCharm是社区版的,那么无法像专业版那样建立Flask项目,对应的文件夹需要自己手动建立。)HarpQA.py中的代码如下:

from flask import Flask

app = Flask(__name__)


@app.route('/')

def hello_world(): 

    return 'Hello World!'


if __name__ == '__main__':

    app.run()

首先从flask导入Flask,(我并没有pip install flask,为何能导入呢?我理解是建立flask项目的时候PyCharm自动帮我们做了这个事情),然后初始化一个Flask对象app,参数是namename代表的是本身这个模块的名字,我们暂时不用理解为何要传入这个参数。接下来是一个hello world函数,并且有一个装饰器@app.route(‘/’),意思是说,当接收到’/’这个网址的请求时,执行hello world这个函数,即返回字符串’Hello World!’(add_url_rule()也可以实现和@app.route一样的功能 ,但使用装饰器应该更pythonic吧),最后使用app.run()运行。运行脚本后,提示Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
我们在浏览器中输入http://127.0.0.1:5000/,就可以在网页中看到’Hello World!’了。

未分类

我们还可以使用debug模式来运行flask的服务端,开启debug模式后,修改代码不需要关闭程序,可以实时生效。有多种方法来开启debug模式:

  1. 在app.run()中添加参数app.run(debug=True);
  2. 在run之前增加app.debug = True;
  3. 新建config文件,在config文件中添加DEBUG = True,然后在程序中引入app.config.from_object(config);
  4. 在run之前增加app.config[‘DEBUG’] = True;

我们使用第3种方法,新建一个独立的文件来保存各种参数,以后项目增大的时候参数增多,便于管理。同样在项目文件夹下新建config.py文件,添加DEBUG = True,DEBUG需大写。在HarpQA.py中import config并添加app.config.from_object(config),再次运行HarpQA.py,提示:

 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 229-291-890
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

说明Debug模式已经打开,我们可以直接修改代码,例如把’Hello World!’
修改成’Hello’并保存,显示提示:

 * Detected change in 'D:\Flask\HarpQA\HarpQA.py', reloading
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 229-291-890
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

说明DEBUG模式检测到了代码的变化并自动重载了,这时候刷新网页,结果也变成了只显示’Hello’。

如果我们要处理很多URL,可以一个一个去给他们写对应的视图函数,这有时候是不切实际的,我们有更高效的做法,如以下代码:

@app.route('/<name>/')
def hello(name):
    return 'Hello %s' % name

@app.route中装饰的地址是’//’,注意name外面用了尖括号,代表name是一个参数,例如我们请求http://127.0.0.1:5000/Harp/这个网址,其中的name就是Harp,这个参数会传递给视图函数hello,最终会返回’Hello Harp’。我们可以给将写成,表示传入的参数是字符串类型的,其他的类型还有int,float,path,几种类型的区别可以在网上搜索对比一下,例如path可以将参数里的’/’也传递过来。

nginx如何配置兼容ThinkPHP各种url模式

我们知道ThinkPHP是有多种访问模式的,比如较常用的普通模式以及rewrite模式,也就是网址 /index.php?m=Zhonglian&c=Index&a=register 以及 网址 /DailiUser/alipay_notify_url,这两种模式用得比较多了。

为什么要做多种兼容呢,因为最近做了支付宝的回调,而支付宝是不认第一种模式的,只能使用 rewrite 模式,而我本地使用的是 nginx 服务器,所以需要在 nginx里面去做一下兼容配置了,配置的方法也很简单,在linux或者windows+nginx的环境下配置 nginx.conf 文件。

location / {    
     root /var/www;    
     index index.html index.htm index.php;    
     if (!-e $request_filename) {    
         rewrite ^/index.php(.*)$ /index.php?s=$1 last;    
         rewrite ^(.*)$ /index.php?s=$1 last;    
         break;    
     }    
 }    

好了,配置成功之后,Thinkphp的三种模式都可以兼容使用了,在本地的话就可以使用普通的模式,如果使用支付宝或者微信支付等回调的话就可以使用 rewrite 类的模式。

linux下nginx不支持中文URL路径的解决方案

未分类

1、确定你的系统是UTF编码

[root@localhost ~]# echo $LAGN
en_US.UTF-8

2、nginx配置文件里默认编码设置为utf-8

server
{
listen 80;
server_name .inginx.com ;
index index.html index.htm index.php;
root /usr/local/nginx/html/inginx.com;
charset utf-8;
}

3、将非UTF-8的文件名转换为UTF-8编码

做法很简单,把文件名都修改成utf8编码就可以了!

安装convmv,由他去转换编码:

yum install convmv -y
convmv -f GBK -t UTF8 -r --notest 目标路径

其中-f是源编码,-t是目标编码,-r是递归处理目录,–notest是不移动,实际上对文件进行改名。