2017-08-04 69 views
2

我有以下htaccess文件:htaccess的重定向失敗,多個網址參數

RewriteEngine On 
RewriteBase/

# Redirect to remove .php 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

# Redirect to "page" for dynamic pages 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteRule ^(.*)$ page?url=/$1 [L] 

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,QSA,NC,L] 

這讓我定製CMS使用動態URL(http://example.com/some-page,例如),重定向到http://example.com/page?url=some-page從而使CMS可以呈現內容。這一切都很好 - 直到有人添加了一個像http://example.com/something/else這樣的URL。當我吐出url參數:print $_GET['url'];我得到/something/else.php/else

所以看起來像刪除.php指令迷路了,第二個參數重複?謝謝你的幫助。

+0

能removeing從字符串.php爲是一個解決辦法? – GrumpyCrouton

+0

第一條規則應該是這樣做的 - 我知道一個是因爲我有幾個靜態頁面可以很好地顯示(沒有.php)。 –

+0

「'page?url =/$ 1 [L]'」 - 不應該是'page.php'嗎? (否則,你正在依靠mod_rewrite以後再添加擴展與另一個重寫。) – MrWhite

回答

2

有這樣說:

Options -MultiViews 
RewriteEngine On 

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteRule^http://%1%{REQUEST_URI} [R=301,NE,L] 

RewriteCond %{ENV:REDIRECT_STATUS} =200 
RewriteRule^- [L] 

# Redirect to remove .php 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^([^/]+)/?$ $1.php [L] 

# Redirect to "page" for dynamic pages 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteRule !^page\.php$ page.php?url=%{REQUEST_URI} [L,NC,QSA] 

下面是變化:

  1. 保持重定向規則重寫規則之前,否則,當www從URL那麼你的內部URL將被暴露刪除。
  2. 在目標中使用page.php而不是page以避免執行另一個重寫規則。
  3. 使用[L]標誌.php添加規則。
  4. 加成Options -MultiViews
+0

不幸的是,這會引發500個內部服務器錯誤 - 但僅限於具有多個URL參數(/ something/else)的頁面。帶有簡單/某些網址的網頁很好。 –

+0

同樣的問題 - page.php位於網站根目錄(/public_html/page.php)。 –

+0

是的,只是這樣做 - 看起來像錯誤是「AH00124:由於可能的配置錯誤,請求超過了10個內部重定向的限制,使用'LimitInternalRecursion'來增加限制,必要時使用'LogLevel debug'來獲得回溯。 「 –