.htaccess RewriteRule怪异的Bug

时间:2016-03-07 21:23:28

标签: .htaccess mod-rewrite url-rewriting

# Do not remove this line or mod_rewrite rules and search engine friendly URLs will stop working

Options +FollowSymLinks
RewriteEngine On

# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{REQUEST_URI} !/system/.* [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

# Redirect www to non-www
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

#--Redirect from "/?page=foo" to "/page/foo"--#
RewriteCond %{THE_REQUEST} /\?page=([^\s]+) [NC]
RewriteRule ^ /page/%1? [NC,L,R]
#--Rewrite "/page/foo/" to "/?page=foo"--#
RewriteRule ^page/([^/]+)/?$ /?page=$1 [NC,L,QSA]

#--Redirect from "/search.php?search=foo" to "/search/foo"--#
RewriteCond %{THE_REQUEST} /search\.php\?search=([^\s]+) [NC]
RewriteRule ^ /search/%1? [NC,L,R]
#--Rewrite "/search/foo/" to "/search.php?search=foo"--#
RewriteRule ^search/([^/]+)/?$ /search.php?search=$1 [NC,L,QSA]

#--Redirect from "/search.php?search=foo&page=bar" to "/search/foo/page/bar"--#
RewriteCond %{THE_REQUEST} /search\.php\?search=([^&]+)&page=([^\s]+) [NC]
RewriteRule ^ /search/%1/page/%2? [NC,L,R]
#--Rewrite "/search/foo/page/bar" to "/search.php?search=foo&page=bar"--#
RewriteRule ^search/([^/]+)/page/([^/]+)/?$ /search.php?search=$1&page=$2 [NC,L,QSA]

#--Redirect from "/post.php?id_post=foo" to "/post/foo"--#
RewriteCond %{THE_REQUEST} /post\.php\?id_post=([^\s]+) [NC]
RewriteRule ^ /post/%1? [NC,L,R]
#--Rewrite "/post/foo/" to "/post.php?id_post=foo"--#
RewriteRule ^post/([^/]+)/?$ /post.php?id_post=$1 [NC,L,QSA]

# Support new SEO-friendly URLs
RewriteRule page/(.*) ?page=$1
RewriteRule search/(.*) search.php?search=$1
RewriteRule search/(.*)/page/(.*) search.php?search=$1&page=$2
RewriteRule post/(.*) post.php?id_post=$1

这是我的文件,它的工作正常但出于某种原因这个:

#--Redirect from "/search.php?search=foo&page=bar" to "/search/foo/page/bar"--#
RewriteCond %{THE_REQUEST} /search\.php\?search=([^&]+)&page=([^\s]+) [NC]
RewriteRule ^ /search/%1/page/%2? [NC,L,R]
#--Rewrite "/search/foo/page/bar" to "/search.php?search=foo&page=bar"--#
RewriteRule ^search/([^/]+)/page/([^/]+)/?$ /search.php?search=$1&page=$2 [NC,L,QSA]

它不能正常工作,它会产生这样的链接:

search.php?search=$1&page=$2

search/search/$1/page/$2

但结果就是这个:

search/search/$1&page=$2

告诉我为什么会发生这种情况,请尝试过许多事情,但仍然无法正常工作。

先谢谢。

1 个答案:

答案 0 :(得分:1)

您的规则顺序不正确。像这样的规则:

RewriteCond %{THE_REQUEST} /search\.php\?search=([^\s]+) [NC]
RewriteRule ^ /search/%1? [NC,L,R]

会匹配/search.php?search=blah以及/search.php?search=blah&page=foo等请求。因为在这种情况下没有什么可以阻止比赛的结束。所以你需要在更一般的比赛之前加上更详细的比赛。这与您的所有?page=XXX规则相同。

此外,您的路由规则:

# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

需要处于最后,而不是之前和重定向的规则。

所以:

# Do not remove this line or mod_rewrite rules and search engine friendly URLs will stop working

Options +FollowSymLinks
RewriteEngine On

# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{REQUEST_URI} !/system/.* [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

# Redirect www to non-www
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

#--Redirect from "/?page=foo" to "/page/foo"--#
RewriteCond %{THE_REQUEST} /\?page=([^\s]+) [NC]
RewriteRule ^ /page/%1? [NC,L,R]
#--Rewrite "/page/foo/" to "/?page=foo"--#
RewriteRule ^page/([^/]+)/?$ /?page=$1 [NC,L,QSA]

#--Redirect from "/search.php?search=foo&page=bar" to "/search/foo/page/bar"--#
RewriteCond %{THE_REQUEST} /search\.php\?search=([^&]+)&page=([^\s]+) [NC]
RewriteRule ^ /search/%1/page/%2? [NC,L,R]
#--Rewrite "/search/foo/page/bar" to "/search.php?search=foo&page=bar"--#
RewriteRule ^search/([^/]+)/page/([^/]+)/?$ /search.php?search=$1&page=$2 [NC,L,QSA]

#--Redirect from "/search.php?search=foo" to "/search/foo"--#
RewriteCond %{THE_REQUEST} /search\.php\?search=([^\s]+) [NC]
RewriteRule ^ /search/%1? [NC,L,R]
#--Rewrite "/search/foo/" to "/search.php?search=foo"--#
RewriteRule ^search/([^/]+)/?$ /search.php?search=$1 [NC,L,QSA]

#--Redirect from "/post.php?id_post=foo" to "/post/foo"--#
RewriteCond %{THE_REQUEST} /post\.php\?id_post=([^\s]+) [NC]
RewriteRule ^ /post/%1? [NC,L,R]
#--Rewrite "/post/foo/" to "/post.php?id_post=foo"--#
RewriteRule ^post/([^/]+)/?$ /post.php?id_post=$1 [NC,L,QSA]

# Support new SEO-friendly URLs
RewriteRule page/(.*) ?page=$1
RewriteRule search/(.*) search.php?search=$1
RewriteRule search/(.*)/page/(.*) search.php?search=$1&page=$2
RewriteRule post/(.*) post.php?id_post=$1

# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]