![nginx 如何重写除具有指定扩展名的少数 URL 之外的所有 URL?](https://linux22.com/image/698668/nginx%20%E5%A6%82%E4%BD%95%E9%87%8D%E5%86%99%E9%99%A4%E5%85%B7%E6%9C%89%E6%8C%87%E5%AE%9A%E6%89%A9%E5%B1%95%E5%90%8D%E7%9A%84%E5%B0%91%E6%95%B0%20URL%20%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%20URL%EF%BC%9F.png)
我正在尝试将文件转换rewrite rules
为.htaccess
配置nginx
。作为将站点移动到网络服务器的一部分NGINX
。
以下是.htaccess
文件的重写规则
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !\.php$
RewriteCond %{REQUEST_URI} !\.gif$
RewriteCond %{REQUEST_URI} !\.jp?g$
RewriteCond %{REQUEST_URI} !\.png$
RewriteCond %{REQUEST_URI} !\.css$
RewriteCond %{REQUEST_URI} !\.js$
RewriteCond %{REQUEST_URI} !\.html$
RewriteCond %{REQUEST_URI} !\.xhtml$
RewriteCond %{REQUEST_URI} !\.htm$
RewriteCond %{REQUEST_URI} !\.ico$
RewriteRule (.*) index.php [L]
RewriteRule (.*).html index.php [L]
我现在的nginx config
。
server {
listen 80;
server_name example.com;
root /usr/share/nginx/html;
location / {
index index.php index.html index.htm;
}
location ~ \.(php)$ {
try_files $uri =404;
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location !~* .(css|js|html|htm|xhtml|php|png|gif|ico|jpg|jpeg)$ {
# Matches requests ending in png, gif, ico, jpg or jpeg.
rewrite ^(.*)$ /index.php break;
rewrite (.*).html /index.php break;
}
}
主页正常运行,但内部站点链接出现 404 错误。
到目前为止我已经尝试了许多类似的重写规则。
if ( $uri ~ ^/(?!(\.css|\.js|\.html|\.htm|\.xhtml|\.php|\.png|\.gif|\.ico|\.jpg|\.jpeg))) {
rewrite ^/(.*)$ /index.php break;
}
但有时,内部链接有效,同时将所有静态文件(如 .css、.js)重定向到主页,有时我无法访问/administrator/
我的网站,它会重定向到主页。
我怎样才能将重写.htaccess
规则复制到nginx
?
答案1
对我来说,这看起来像一个标准的前端控制器模式。在 nginx 中,它的实现如下:
server {
listen 80;
server_name example.com;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.(php)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
这里的逻辑是,它首先尝试查找所请求的资源是否存在于文件或目录中。如果存在,则将其返回给客户端。否则,请求将传递给 PHP 脚本,然后由该脚本确定要返回给客户端的内容。