我試圖使用mod_rewrite重定向某些頁面以使用SSL。對於我有:帶外部重定向和內部重寫的mod_rewrite
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} !^/login(\.php)?$ [NC]
RewriteCond %{REQUEST_URI} !^/contact-us(\.php)?$ [NC]
RewriteCond %{REQUEST_URI} !^/\..*$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC]
RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{REQUEST_URI} ^/login(\.php)?$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/contact-us(\.php)?$ [NC]
RewriteRule ^(.+)\.php$ https://www.example.com/$1 [R=301,L]
這工作正常,並且正是我想要它做。
在我.htacess後來我有一個:
RewriteRule ^members/(.+)/change-password$ members/.change-password.php?item=$1 [NC,QSA,L]
因此,如果出現一個網址,例如:
/members/.change-password.php?item=foo-bar
:
http://www.example.com/members/foo-bar/change-password
內部將它作爲處理
再次,這工作得很好,正在做我想要的東西。
我現在需要做的是將其包含在我的原始SSL重定向邏輯中,以確保任何更改密碼請求都被重定向到相同的URL,而不是通過https。我試過了:
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} !^/login(\.php)?$ [NC]
RewriteCond %{REQUEST_URI} !^/contact-us(\.php)?$ [NC]
RewriteCond %{REQUEST_URI} !^/\..*$
RewriteCond %{REQUEST_URI} !^/members/.+/change-password [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC]
RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{REQUEST_URI} ^/login(\.php)?$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/contact-us(\.php)?$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/members/.+/change-password [NC]
RewriteRule ^(.+)\.php$ https://www.example.com/$1 [R=301,L]
但這不起作用 - 我只是通過http傳遞頁面。將.+
更改爲.*
似乎讓我進入永久性重定向循環。
我猜這是因爲內部重寫,但無論我嘗試什麼,我似乎無法解決它。
任何人都可以請指教?
感謝,
亞當M.
不要依靠自動重定向,請確保您的鏈接指向這些部分使用「https://」。 (有關詳細信息,請參見[本答案](http://webmasters.stackexchange.com/a/28443/11628)和[本答案](http://stackoverflow.com/a/9105894/372643)。) – Bruno 2012-04-14 18:21:12
@布魯諾感謝您的迴應,但前端鏈接直接指定爲https。自動重定向的原因是對於那些自己輸入url的人來說是帶和大括號。雖然我可以''非]請求的網址,不會提供我所期望的用戶體驗(儘管我當然不是每個人都會同意這種做法)。 – 2012-04-14 19:44:34
只要您在開發應用程序時不假定這些重定向在那裏,您的方法的確有意義。 – Bruno 2012-04-15 17:38:55