为特定的重写查询添加尾部斜杠

时间:2015-10-11 12:31:33

标签: php regex apache .htaccess mod-rewrite

我正在进行“ManualTranslation”课程,而且我被困在.htaccess部分。

我正在尝试将此查询?language=xx重写为/xx/

到目前为止,我设法让它发挥作用,不确定它是否有任何好处或正确......但它确实缺少一件事。如果由于某种原因 - 有人试图通过说:

手动选择语言

http://domain.com/it并且忘记添加尾部斜杠,我的.htaccess碎片失败了。因此,如果此查询参数中缺少斜杠,则应自动添加该斜杠。

RewriteEngine On
Options +FollowSymlinks
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-zA-Z]{2})/(.*)$  $2?language=$1 [QSA]

所以现在,这只会这样: http://domain.com/it/但不是http://domain.com/it,因为缺少尾随斜杠。

如果有人能告诉我我错过了什么?

另外,我想知道如果找不到语言,是否有机会用php删除重写的查询字符串。现在我基本上只是重定向回当前文件,我对它不满意......

if ( isset($query) && !$this->isAllowed($query) )
{
    header("Location: {$_SERVER['PHP_SELF']}");
    exit;
}

2 个答案:

答案 0 :(得分:1)

您可以调整当前规则,以允许不以/结尾的网址:

RewriteEngine On
Options +FollowSymlinks
RewriteBase /

## Adding a trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{THE_REQUEST} \s/+.*?[^/][?\s]
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})(/.*)?$ $2?language=$1 [QSA,L]

但请注意,http://domain.com/contacts之类的网址不会受到上述规则的影响,您也不会填充language参数。

答案 1 :(得分:0)

试试这个:

RewriteCond ^([a-z]{2})$ /$1/ [R=301,L,NC]

将它放在RewriteBase行之后。