Php 如何在Nginx';重写规则是什么?
我想做的是允许以下任何一项工作: site.mydomain.com/{id}?args(默认为index.php) site.mydomain.com/{id}/{any file if exists}?args(可以是calendar.php、upload.php等,如果不是,则为404) 我的Nginx配置中包含以下内容:Php 如何在Nginx';重写规则是什么?,php,nginx,ubuntu-18.04,Php,Nginx,Ubuntu 18.04,我想做的是允许以下任何一项工作: site.mydomain.com/{id}?args(默认为index.php) site.mydomain.com/{id}/{any file if exists}?args(可以是calendar.php、upload.php等,如果不是,则为404) 我的Nginx配置中包含以下内容: server { listen 80; large_client_header_buffers 4 32k; server_name sit
server {
listen 80;
large_client_header_buffers 4 32k;
server_name site.mydomain.com;
root /var/www/php/my_site/public;
index index.php;
access_log /var/log/sites/my_site.access.log;
error_log /var/log/sites/my_site.error.log error;
location / {
rewrite ^/([0-9]+)/?$ /index.php?s=$1$is_args$args last;
include /etc/nginx/conf.d/php.inc;
}
location ~ /\.ht {
deny all;
}
}
这是我的php.inc,我将它包含在我的位置,因此它将实际执行php而不是下载它:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
当我进入site.mydomain.com/{id}
时,它会工作
如果我在它的末尾附加/index.php
,我会得到一个404错误,或者任何其他php文件
我需要index.php(和其他文件),因为它向后兼容旧的应用程序
我已经尝试了很多配置选项,比如SO和Google,但我似乎无法让它工作。我对nginx相当陌生,所以我有点不知所措
以下是我的目录结构(如果有帮助):
/var/www/php/my_site
/application
/library
/public
/static
/styles
/javascript
编辑
我尝试了以下建议的答案:
rewrite ^/([0-9]+)(/|/index.php)?$ /index.php?s=$1 break;
它也做同样的事情。我更新了我的问题,使之比以前更具体一些 可能的解决方案:
location / {
}
location ~ /\.ht {
deny all;
}
location ~ ^/([0-9]+)($|/) {
rewrite ^/([0-9]+)/?$ /index.php?s=$1 last;
rewrite ^/([0-9]+)/(.*)\.php$ /$2.php?s=$1 last;
rewrite ^/([0-9]+)/(.*)$ /$2 last;
}
location ~ \.php$ {
try_files $uri =404;
...
}
最后三个位置
块的顺序很重要
include/etc/nginx/conf.d/php.inc
已从location/
块中移出并插入到末尾,因此它提供了顶级location~\.php$
块,而不是嵌套的location块。我在上面的示例中显示了include文件的内容,但是您的include
语句的工作原理完全相同
location~^/([0-9]+)($|/)
块处理以/{id}
节开头的任何URI<代码>重写自动将原始查询字符串附加到重写的URI。有关详细信息,请参阅
您应该在
location~\.php$
块中包含try\u files
语句,以避免在php文件不存在时发送并返回404响应。感谢您提供的信息。我按照你的建议做了,在进入index.php时仍然得到了404。尽管没有它,它仍然可以工作。另外,我还有一些需要访问的php页面。有没有一种方法可以让php一网打尽?这里的整个想法是能够读入{id}参数,并将其传递到my main controller.php中,以识别用户您可能提供的任何其他信息?(/|index.php)
不起作用。我还更新了我的问题,以包括所有php文件,而不是index.php。我感谢你已经给予的帮助。好的,谢谢。明天早上我要试试这个。我非常感谢你的回答,所以法蒂的工作很有魅力!!非常感谢你,你帮我省了很多麻烦。难道只有php文件有id前缀吗?您想用s=id
参数重写这些吗?{id}
是URL的一部分。所以:mysite.domain.com/12345/index.php或mysite.domain.com/4567/index.php(或ajax.php,info.php)。是的,这意味着12345=s=12345或s=4567,但不是静态文件?或者您希望它也从静态文件的URL中剥离,例如,/12345/base.css
正确,使用基本URL可以很好地处理静态文件。所以我不需要这些