简体   繁体   中英

Htaccess - remove .php extension and keep query

I've tried to remove the .php extension and keep the id query parameter, but I get a 404 error.

This is the URL:

example.com/folder/file.php?q=123

And I want it to be:

example.com/folder/file/123

Here is my .htaccess file:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^$1/(.*)$ /$1.php?q=$2
RewriteCond %{REQUEST_FILENAME}.-f RewriteRule ^([^\.]+)$ $1,php [NC,L]

This would internally rewrite the URL from /folder/file/123 to /folder/file/123.php , which is obviously going to result in a 404. It would be preferable to test that the corresponding .php file exists, rather than testing that the request does not already map to a file.

I'm assuming the q URL parameter always takes a numeric value.

Try the following instead:

# Rewrite "/folder/<file>/<123>" to "/folder/<file>.php?q=<123>"
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)/(\d+)$ $1.php?q=$2 [L]

The NC flag is not required.


 RewriteRule ^$1/(.*)$ /$1.php?q=$2

This rule doesn't make sense and is redundant.

Assuming last path component makes query parameter q , you can use this rule:

RewriteEngine On

# ignore all files and directories from rewrite
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# Add .php extension and use last component as parameter q
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+)/([\w-]+)/?$ $1.php?q=$2 [L,QSA]

# Add .php extension
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM