我在使用.htaccess删除php扩展时遇到问题。这是规则:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php?$2 [QSA,L]
此链接sak.ps/overview
适用于www.sak.ps/overview.php
,但sak.ps/overview/1
sak.ps/overview.php?flag=1
会导致内部服务器错误!
但在这两种情况下,URL都显示在带有php扩展名的URL选项卡中。
答案 0 :(得分:0)
您的规则末尾不需要?$2
,QSA
标志会根据其定义自动附加查询字符串。
如果我没弄错的话,错误是因为规则正则表达式中没有第二个捕获组。
答案 1 :(得分:0)
1。在您的规则中$2
将始终为空,因为您没有相应的捕获组。
2。您的规则仅适用于将.php扩展名添加到请求的网址末尾的网址。对于您的第二个URL示例,您需要具有单独的规则。
RewriteEngine on
# 1) add .php file extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]
# 2) more complex case of adding .php extension
# will work with URLs like
# /overview/something/here => /overview/something.php?flag=here
# /overview/1 => /overview.php?flag=1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.+)/([^/]+)$ $1.php?flag=$2 [QSA,L]
# 3) Another type of URL
# will work with URLs like
# /overview/something/here => /overview.php?flag=something/here
# /overview/1 => /overview.php?flag=1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^([^/]+)/(.+)$ $1.php?flag=$2 [QSA,L]
我提供了两种方法的规则:
规则#2将处理/overview/something/here
=> /overview/something.php?flag=here
(最后一段将被视为参数,而所有先前的段将被视为文件名);
规则#3将处理/overview/something/here
=> /overview.php?flag=something/here
(第一个段将被视为文件名,而所有其他段将被视为参数);
/overview/1
=> /overview.php?flag=1
重写可由两者(#2或#3)处理。