繁体   English   中英

RewriteRule阻止RewriteCond和RewriteRule之后

[英]RewriteRule blocking RewriteCond & RewriteRule after it

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

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

我正在尝试将旧丑陋的URL更改为更好的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]

确保您正在做的第一件事就是将所有重定向放在第一位。 也就是说,具有R标志的每个规则都需要在不具有R标志的规则之前。 但看起来你没有匹配-样式的URL来重写它们返回到带有查询字符串的版本。 所以我认为你真的想要这样的东西(当你摆脱查询字符串时你可以摆脱.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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM