2015-07-13 68 views
1

如果这是一个重复的话,我真的很抱歉,但我用谷歌和搜索也是这里找不到任何会为我工作。也许我只是不知道究竟要搜索什么。重写规则阻挡的RewriteCond重写规则及后

不管怎样,回到我的问题:

我试图改变旧丑陋的URL网址更好(想有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.php文件开始加载后不能识别news

我完全地失去了,因为我不跟的.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] 

回答

3

,你需要确保你正在做的第一件事是把所有的重定向第一。也就是说,每个具有R标志的规则都必须位于没有规则的规则之前。但它看起来就像你不匹配-风格的URL BACK与查询字符串的版本重写它们。所以我认为你真的想要这样的东西(你可以摆脱.php扩展名,而你摆脱查询字符串):

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] 
+0

嗯,这真的很好。我实际上最终使用了类似的东西(我将代码放在我的问题中),但由于我没有使用.htaccess和apache,我只是使用ORP标志来存储.PHP文件版本。你能详细介绍一下''(?:\。php |)''吗?当我试图使用(其实我没有用''?'',它只是放在''.php''到''%1'' ...谢谢 – MiChAeLoKGB

+1

@MiChAeLoKGB的':?'使'()'所做的分组未被捕获,所以它不能被反向引用。参见http://stackoverflow.com/questions/10804732/what-is-the-difference-between-and-in-regex它基本上意味着可以是一个'.php'或没有,使得'.php'可选如果您删除':?',括号成为捕获分组和'%1'最终会逆向引用它,而不是 –

+0

感谢有关信息,所以我使用了部分代码和我的代码的一部分,现在它的工作原理...它很繁琐,以改变CMS上的URL ... .htaccess它的好,但你仍然必须改变谁知道白痴链接多少个文件:D Anway,谢谢你的帮助。 – MiChAeLoKGB