htaccess重定向url与多个查询字符串args到SEO友好网址

时间:2014-10-09 05:02:08

标签: php apache .htaccess mod-rewrite redirect

我已经抓了StackExchange 3天了,接近找到我的问题的解决方案,但不断做空。

我正在使用htaccess重写并将网址重定向到SEO友好网址。我的htaccess目前如下。

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]

########################################
#   REMOVE INDEX.PHP FROM THE URL
########################################
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC]
RewriteRule ^ %1 [R=301,L]

##################################################
#   REWRITE QUERY STRING INTO SEO FRIENDLY URL
##################################################
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(?:index\.php)?\?page=([^\s]+)? [NC]
RewriteRule ^ /%1? [R=301,L]

目前我的链接传递了1个主要参数'?page = somepage'。在我的用户页面上,我的链接不仅传递了页面参数,还传递了用户的id。该链接如下:

?page=users&id=1

此外,用户可以选择编辑自己的个人资料,以便链接如下:

?page=users&id=1&do=edit

我的htaccess正确处理url的重写和重定向,但仅当{QUERY_STRING}只有一个传递的参数时。

我使用现有的RewriteCond在查询字符串中查找多个参数,并尝试更改RewriteRule以处理查询字符串中的多个参数。在处理2个参数时我很成功,但我的原始规则(1个参数)破裂了。

我应该如何编写RewriteCond / RewriteRule来处理带有1个或更多{QUERY_STRING}个参数的网址?

我希望我的网址来自:

?page=users
?page=users&id=1
?page=users&id=1&do=edit

到此:

/users
/users/1
/users/1/edit

1 个答案:

答案 0 :(得分:0)

在修改我的htaccess文件后,我设法找到了解决问题的方法。这证明了您经常寻找的答案往往是最明显和最容易被忽视的。以下是我更新并正在使用的htaccess文件。

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]

########################################
#   REMOVE INDEX.PHP FROM THE URL
########################################
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC]
RewriteRule ^ %1 [R=301,L]

##################################################
#   RERWITE QUERY STRING INTO SEO FRIENDLY URL
##################################################
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(?:index\.php)?\?page=([^\s]+)? [NC]
RewriteRule ^ /%1? [R=301]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(?:index\.php)?\?page=([^\s]+)&id=([^\s]+)? [NC]
RewriteRule ^ /%1/%2? [R=301]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(?:index\.php)?\?page=([^\s]+)&id=([^\s]+)&do=([^\s]+)? [NC]
RewriteRule ^ /%1/%2/%3? [R=301,L]

虽然这对我的需求有效,但我还有另一个问题....有没有办法在这个文件中简化我的htaccess RewriteCond / RewriteRule?