我目前有一个nginx配置,可以使用“/ contact”创建对“/contact.php”等文件的请求。我找到了一个解决方案,可以将任何.php请求重定向到友好的同行,但是,我认为可能有更优雅的解决方案。
是否可以对URI进行403或404请求,例如“/articles/index.php”或“/ articles / index”(请注意,友好的URI重写已启用)并且仅通过“/ articles /”接受请求“哪个仍会加载”/articles/index.php“文件?
基本上,我希望任何目录中的任何“/ index”或“/index.php”或者403或404的.php请求,并且只接受友好的无扩展请求或目录root /加载index.php(不带它在URI中被请求。
这可能吗?我在我的配置中尝试了类似的东西来拒绝.php请求,但由于技术上有重写,它只会拒绝所有请求。它目前不在那里,因为它不起作用。
当前配置:
location / {
try_files $uri $uri/ @extensionless-php;
index index.php;
}
location @extensionless-php {
rewrite ^(.*)$ $1.php last;
}
location ~ /includes/(.+)\.php$ {
deny all;
}
location ~ \.php {
try_files $uri =404;
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
答案 0 :(得分:0)
这似乎是somewhat of a duplicate of your later question,但是,如果您仍然想要解决此问题,以下代码应该执行您想要的操作,而不会实际拒绝所有请求。
if ($request_uri ~ "^[^?]*?(/index(?:\.php)?|\.php)(?:\?.*)?$") { return 403; }
使用pcre
(which is the library that nginx uses)进行一些调试。
$ pcretest
PCRE version 8.30 2012-02-04
re> #^[^?]*?(/index(?:\.php)?|\.php)(?:\?.*)?$#
data> /test
No match
data> /test.php
0: /test.php
1: .php
data> /index.php
0: /index.php
1: /index.php
data> /iindex.php
0: /iindex.php
1: .php
data>