用 nginx 重写所有对 index.php 的请求 [英] Rewrite all requests to index.php with nginx
问题描述
在我的 apache 配置中,我有以下简单的重写规则
In my apache configuration I have the following simple rewrite rule which
- 除非文件存在,否则将重写为 index.php
- 在网址上,您永远看不到文件扩展名 (.php)
如何在 nginx 中重写它?
how can I rewrite this in nginx?
#
# Redirect all to index.php
#
RewriteEngine On
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (/[^.]*|.)$ [NC]
RewriteRule .* index.php [L]
这是我的 nginx 服务器块现在的样子,但它不起作用:(
Here's how my nginx server block looks like now, but it doesn't work :(
root /home/user/www;
index index.php;
# Make site accessible from http://localhost/
server_name some-domain.dev;
###############################################################
# exclude /favicon.ico from logs
location = /favicon.ico {
log_not_found off;
access_log off;
}
##############################################################
# Disable logging for robots.txt
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
##############################################################
# Deny all attempts to access hidden files such as
# .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /. {
deny all;
access_log off;
log_not_found off;
}
##############################################################
#
location / {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php$args;
fastcgi_pass 127.0.0.1:9000;
}
###############################################################
# serve static files directly
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
access_log off;
expires 30d;
}
###############################################################
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ .php$ {
fastcgi_split_path_info ^(.+.php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
# With php5-cgi alone:
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
推荐答案
1 除非文件存在将重写到 index.php
将以下内容添加到您的 location ~ .php$
Add the following to your location ~ .php$
try_files = $uri @missing;
这将首先尝试提供文件,如果未找到,它将移至 @missing
部分.因此还要将以下内容添加到您的配置中(在 location
块之外),这将重定向到您的索引页面
this will first try to serve the file and if it's not found it will move to the @missing
part. so also add the following to your config (outside the location
block), this will redirect to your index page
location @missing {
rewrite ^ $scheme://$host/index.php permanent;
}
<小时>
2 在您永远不会看到文件扩展名 (.php) 的网址上
要删除 php 扩展,请阅读以下内容:http://www.nullis.net/weblog/2011/05/nginx-rewrite-remove-file-extension/
to remove the php extension read the following: http://www.nullis.net/weblog/2011/05/nginx-rewrite-remove-file-extension/
以及来自链接的示例配置:
and the example configuration from the link:
location / {
set $page_to_view "/index.php";
try_files $uri $uri/ @rewrites;
root /var/www/site;
index index.php index.html index.htm;
}
location ~ .php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/site$page_to_view;
}
# rewrites
location @rewrites {
if ($uri ~* ^/([a-z]+)$) {
set $page_to_view "/$1.php";
rewrite ^/([a-z]+)$ /$1.php last;
}
}
这篇关于用 nginx 重写所有对 index.php 的请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!