RewriteRule阻止RewriteCond&它之后的RewriteRule

时间:2015-07-13 13:18:57

标签: php apache .htaccess mod-rewrite

如果这是重复,那么我真的很抱歉,但我使用谷歌并在这里搜索,找不到任何对我有用的东西。也许我只是不知道究竟要搜索什么。

无论如何,回到我的问题:

我正在尝试将旧的丑陋网址更改为更好的网址(想要news/XXX/XY但是相对链接打败了我),所以我写了几行代码到我的.htaccess并测试了它们(好吧,我实际上使用过)在我的另一页上用于重定向的相同代码,所以我知道它确实有用)。我从/news.php重定向到/news,但查询字符串魔法根本不起作用...

RewriteRule ^news.php$ /news [L,NC,R=301]
RewriteRule ^news?$ /news.php [L,NC]

RewriteCond %{THE_REQUEST} /news\?rowstart=([^\s]+) [NC]
RewriteRule ^ news-row-%1? [R=302,L]

RewriteCond %{THE_REQUEST} /news\?readmore=([^\s]+)&rowstart=([^\s]+) [NC]
RewriteRule ^ news-%1-%2? [R=302,L]

RewriteCond %{THE_REQUEST} /news\?readmore=([^\s]+) [NC]
RewriteRule ^ news-%1? [R=302,L]

第一个执行后的RewriteRules都没有执行。但如果我像这样改变我的.htaccess:

RewriteRule ^news.php$ /news [L,NC,R=301]

RewriteCond %{THE_REQUEST} /news\?rowstart=([^\s]+) [NC]
RewriteRule ^ news-row-%1? [R=302,L]

RewriteCond %{THE_REQUEST} /news\?readmore=([^\s]+)&rowstart=([^\s]+) [NC]
RewriteRule ^ news-%1-%2? [R=302,L]

RewriteCond %{THE_REQUEST} /news\?readmore=([^\s]+) [NC]
RewriteRule ^ news-%1? [R=302,L]

RewriteRule ^news?$ /news.php [L,NC]

然后它的工作原理。我尝试使用/\?bla - /news\?bla - /news\.php\?bla等。实际上没有任何效果。

有人有任何想法为什么它的表现如此以及如何解决它?在news文件开始加载后,它似乎无法识别news.php

我完全迷失了,因为我经常不和.htaccess合作。有什么想法吗?

我实际上最终使用了这个:

#########################
#   NICE URLS QUERIES   #
#########################

RewriteCond %{THE_REQUEST} /news(?:\.php|)\?rowstart=([^\s]+) [NC]
RewriteRule ^ news-page-%1? [R=302,L]

RewriteCond %{THE_REQUEST} /news\(?:\.php|)\?readmore=([^\s]+)&rowstart=([^\s]+) [NC]
RewriteRule ^ news-%1-%2? [R=302,L]

RewriteCond %{THE_REQUEST} /news(?:\.php|)\?readmore=([^\s]+) [NC]
RewriteRule ^ news-%1? [R=302,L]

RewriteRule ^news-([0-9]+)-([0-9]+)?$ news.php?readmore=$1&rowstart=$2 [L,QSA,NC]
RewriteRule ^news-([0-9]+)/?$ news.php?readmore=$1 [L,QSA,NC]
RewriteRule ^news-page-([0-9]+)/?$ news.php?rowstart=$1 [L,QSA,NC]


#######################
#   OTHER NICE URLS   #
#######################

RewriteRule ^news.php$ /news [L,NC,R=301]
RewriteRule ^news?$ /news.php [L,NC]

1 个答案:

答案 0 :(得分:3)

确保您正在做的第一件事就是先将所有重定向放在首位。也就是说,每个具有R标志的规则都需要在不具有-标志的规则之前。但看起来您似乎没有匹配.php样式的网址,而是将 BACK 重写为带有查询字符串的版本。所以我认为你真的想要这样的东西(当你摆脱查询字符串时你可以摆脱RewriteCond %{THE_REQUEST} \ /+news\.php(\ |$) RewriteRule ^ /news [L,R=301] RewriteCond %{THE_REQUEST} \ /+news(?:\.php|)\?rowstart=([\ &]+) RewriteRule ^ /news-row-%1? [L,R=301] RewriteCond %{THE_REQUEST} \ /+news(?:\.php|)\?readmore=([^&]+)&rowstart=([\ &]+) RewriteRule ^ /news-%1-%2? [L,R=301] RewriteCond %{THE_REQUEST} \ /+news(?:\.php|)\?readmore=([\ &]+) RewriteRule ^ /news-%1? [L,R=301] ## Now, internally rewrite the request back to the query string and php extension RewriteRule ^news$ /news.php [L] RewriteRule ^news-row-(.*)$ /news.php?rowstart=$1 [L,QSA] RewriteRule ^news-(.*)-(.*)$ /news.php?readmore=$1&rowstart=$2 [L,QSA] RewriteRule ^news-(.*)$ /news.php?readmore=$1 [L,QSA] 扩展名):

$hash = md5($email.$password);
相关问题