Htaccess - 删除 .php 扩展名并保留查询

Htaccess - remove .php extension and keep query

提问人:Adir 提问时间:1/7/2023 最后编辑:RavinderSingh13Adir 更新时间:1/8/2023 访问量:120

问:

我试图删除扩展并保留查询参数,但我收到 404 错误。.phpid

这是 URL:

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

我希望它是:

example.com/folder/file/123

这是我的文件:.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^$1/(.*)$ /$1.php?q=$2
apache .htaccess mod-rewrite 重写friendly-url

评论

0赞 MrWhite 1/7/2023
澄清一下,您实际上是在向表单的 URL 发出请求(因为表单本身实际上并没有“更改”URL)。该文件可能在文档根目录中?/folder/file/123.htaccess.htaccess
0赞 MrWhite 1/7/2023
是否还需要处理没有其他参数的无扩展名 URL?例如。?/folder/file

答:

1赞 MrWhite 1/7/2023 #1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

这将在内部重写 URL 从 to ,这显然会导致 404。最好测试相应的文件是否存在,而不是测试请求是否尚未映射到文件。/folder/file/123/folder/file/123.php.php

我假设 URL 参数始终采用数值。q

请尝试以下操作:

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

该标志不是必需的。NC


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

此规则没有意义,并且是多余的。

1赞 anubhava 1/7/2023 #2

假设最后一个路径组件使查询参数,则可以使用以下规则:q

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]