用nginx重写所有对index.php的请求
在我的Apacheconfiguration,我有以下简单的重写规则
- 除非文件存在将重写到index.php
- 在你永远不会看到文件扩展名(.php)
我怎么能重写这个在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服务器块现在的样子,但它不工作:(
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$
try_files = $uri @missing;
这将首先尝试提供该文件,如果没有find它将移动到@missing
部分。 所以也添加以下内容到您的configuration( location
块外),这将redirect到您的索引页面
location @missing { rewrite ^ $scheme://$host/index.php permanent; }
2在你永远不会看到文件扩展名(.php)
删除php扩展阅读以下内容: http : //www.nullis.net/weblog/2011/05/nginx-rewrite-remove-file-extension/
以及链接中的示例configuration:
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 ~* ^/([az]+)$) { set $page_to_view "/$1.php"; rewrite ^/([az]+)$ /$1.php last; } }
完美的解决scheme我已经尝试过,并成功获得我的索引页,当我在我的网站configuration文件中追加此代码。
location / { try_files $uri $uri/ /index.php; }
在configuration文件本身解释说,在“首先尝试作为文件服务请求,然后作为目录,然后回到index.html在我的情况下是index.php,因为我通过php代码提供页面。
要传递getvariables以及使用$args
:
location / { try_files $uri $uri/ /index.php?$args; }
平坦而简单的configuration无需重写,可以在某些情况下工作:
location / { fastcgi_pass unix:/var/run/php5-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /home/webuser/site/index.php; }
这是什么为我解决这个问题的第一部分:
location / { rewrite ^([^.]*[^/])$ $1/ permanent; try_files $uri $uri/ /index.php =404; include fastcgi_params; fastcgi_pass php5-fpm-sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; }
重写^([^。] * [^ /])$ $ 1 / permanent; 重写非文件地址(没有文件扩展名的地址)在最后有一个“/”。 我这样做是因为我遇到了“访问被拒绝”。 当我尝试访问没有它的文件夹时出现消息。
try_files $ uri $ uri / /index.php=404; 是从三好市的答案借来的,但是如果还没有find位置的话,还要多加一个404重新路由。
fastcgi_index index.php; 是我失踪的最后一块难题。 该文件夹没有重新路由到index.php没有这一行。
如果你想通过index.php(没有其他的PHP文件将被传递给fastcgi)fastcgi万一你有这样的路线在像codeigniter这样的框架
$route["/download.php"] = "controller/method"; location ~ index\.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi.conf; }
这是你的第二个问题的答案:
location / { rewrite ^/(.*)$ /$1.php last; }
这是我的工作(根据我的经验),意味着你所有的blabla.php将重写成blabla
像http://yourwebsite.com/index.php到http://yourwebsite.com/index
使用nginx $ is_args而不是? 对于GET查询string
location / { try_files $uri $uri/ /index.php$is_args$args; }
- 为什么我在Rails应用程序中使用force_ssl获取无限redirect循环?
- 如何使用nginx proxy_pass保存请求的URL
- 尽pipeconfigurationNginX 60秒后发出HTTP 499错误。 (PHP和AWS)
- force_ssl在Rails中做了什么?
- 来自nginx / passenger的“应用程序收到的不完整回复”
- 高负载下的502网关错误(nginx / php-fpm)
- nginx as webserver incl。 socket.io和node.js / ws:// 400 Bad Request
- 使用Docker Rails 5 Postgres应用程序的Nginx路由
- Nginx不同的域在相同的IP