How to convert this very simple .htaccess to Nginx?
I'm using this .htaccess
that pass everything after URL to $param
, so
example.com/news/id
goes to PHP as $_GET['param']='news/id'
. But Nginx is always throwing me to 404 page.
My .htaccess
:
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule (.*) index.php?param=$1
What I tried in Nginx default.conf
:
server {
listen 80;
listen [::]:80;
server_name domain.com;
root /var/www/html;
location / {
if (!-f $uri){
set $rule_0 1$rule_0;
}
if (!-d $uri){
set $rule_0 2$rule_0;
}
if ($rule_0 = "21"){
rewrite ^(.*) index.php?param=$1;
}
}
}
You don't use if
here at all, nor do you manually check for the existence of files. This common pattern is handled instead by try_files
.
For example:
location / {
try_files $uri $uri/ /index.php?param=$uri;
}
(If your web app is broken and can't handle the leading /
in the URI, fix the web app if possible, or see this question if not.)
I could fix it using these rules:
server{
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=$1;
}
}
If you have location / { } without any instructions inside, remove it.