2015-07-13 64 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