我很想弄清楚为什么其中一个 htaccess 指令删除了查询字符串,而另一个却没有。
RewriteCond %{QUERY_STRING} p=invitations
RewriteRule ^index.php$ /Invitations? [L,R=301,QSD]
RewriteCond %{QUERY_STRING} p=corporate_invitations
RewriteRule ^index.php$ /Invitations/Corporate? [L,R=301,QSD]
第一个将从以下 URL 重定向:/index.php?l=page_view&p=invitations并正确重写为/邀请函。
第二,如果你导航到/index.php?l=page_view&p=corporate_invitations您将被重定向至/邀请函/公司?l=page_view&p=corporate_invitations所以我的问题是为什么第一个删除了查询字符串而第二个没有删除。
- 编辑 -
由于我使用的是 Apache 2.4.12,因此我删除了末尾的 ?,因为 QSD 对于其他行来说工作正常。我添加了更多规则,唯一无法删除查询字符串的是 Invitations/Corporate。它确实重定向了,但保留了查询字符串。我认为可能是规则中间的 / 导致的,但 Invitations/Party 工作正常。
整个.htaccess 文件是:
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteCond %{QUERY_STRING} p=corporate_invitations
RewriteRule ^index.php$ /Invitations/Corporate [L,R=301,QSD]
RewriteCond %{QUERY_STRING} p=invitations
RewriteRule ^index.php$ /Invitations [L,R=301,QSD]
RewriteCond %{QUERY_STRING} p=message_in_a_bottle_gifts
RewriteRule ^index.php$ /GiftBottles [L,R=301,QSD]
RewriteCond %{QUERY_STRING} p=party_invitations
RewriteRule ^index.php$ /Invitations/Party [L,R=301,QSD]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php%{REQUEST_URI}