我如何在mod_rewrite,htaccess中解决这个问题?

时间:2011-09-07 20:18:05

标签: .htaccess mod-rewrite

我在使用.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选项卡中。

2 个答案:

答案 0 :(得分:0)

您的规则末尾不需要?$2QSA标志会根据其定义自动附加查询字符串。

如果我没弄错的话,错误是因为规则正则表达式中没有第二个捕获组。

答案 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)处理。