我在网上发现了几十篇关于如何设置mod_rewrites的文章但是为了爱上帝,我无法弄清楚如何在所有页面上正确强制HTTPS,然后在某些目录上强制HTTP或(已经重写)页。
现在这个变得非常棘手,因为我需要在这个目录上使用HTTPS,除了两种情况,例如" / surf"实际上是从" surf.php"和#34;改写 - ([0-9a-zA-Z - ] +)$"这是从" promote.php?user = $ 1" :
<Directory /home/rotate/public_html/ptp/>
AllowOverride None
Order Deny,Allow
Allow from all
Options +SymLinksIfOwnerMatch
ErrorDocument 404 "<h1>Oops! Couldn't find that page.</h1>"
RewriteEngine On
RewriteRule ^promote-([0-9]+)$ promote.php?user=$1 [QSA,NC,L]
RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]
</Directory>
我尝试了一些东西,但这只会导致一些奇怪的重定向循环......
RewriteCond %{HTTPS} on
RewriteRule !^(surf|promote-([0-9]+)$) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
所以基本上我需要在/ ptp / except / ptp / surf中强制使用HTTPS(这是从surf.php和/ ptp / promote-123重写的,它是从promote.php重写的?user = 123
目前我正在根据我的需要使用PHP重定向到HTTP或HTTPS,但我知道如果我能通过重写来实现它会更快。 任何指针,提示,建议?感谢。
UPDATE2:这有效:
RewriteCond %{HTTPS} off
RewriteRule !^(surf|promote(-[0-9]+)?) https://%{HTTP_HOST}%{REQUEST_URI} [R=301]
RewriteRule ^promote-([0-9]+)$ promote.php?user=$1 [NC,L]
RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php
但是,除非我指定了绝对的HTTPS路径,否则浏览器会阻止javascript,字体等资源。请注意,通过PHP重定向时,这种情况从未发生过......
答案 0 :(得分:2)
我改变了一点,它完美地运作
删除更改RewriteRule
以将文件与.php
匹配到底部。
删除模式结束的$
符号
正如更新promote-1111
中所述将重定向到promote.php?user=$1
,将promote-[0-9]+
更改为promote(-[0-9]+)?
,否则当您将其重定向到{{1}时,它将在第二次重定向中覆盖}}
promote.php?user=$1
不要介意此图片中显示的错误消息。由于我是从我的本地主机尝试过的,因此它没有证书。
可以使用服务器
答案 1 :(得分:1)
由于使用<Directory>
上下文的副作用,您的规则不在“更新”中。每次替换都会再次开始处理。
当您请求/ promote-123并重写它以将数字放入查询字符串时,您无法匹配这些数字,就好像它们仍在路径中一样。您需要将重写路径和数字与RewriteCond%{QUERY_STRING}匹配(如果您关心数字)