用于特定文件夹和路径的Apache mod_rewrite

时间:2017-06-15 06:00:50

标签: apache .htaccess mod-rewrite

我在网上发现了几十篇关于如何设置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重定向时,这种情况从未发生过......

2 个答案:

答案 0 :(得分:2)

我改变了一点,它完美地运作

更改

删除更改RewriteRule以将文件与.php匹配到底部。

删除模式结束的$符号

正如更新promote-1111中所述将重定向到promote.php?user=$1,将promote-[0-9]+更改为promote(-[0-9]+)?,否则当您将其重定向到{{1}时,它将在第二次重定向中覆盖}}

代码

promote.php?user=$1

页面冲浪

enter image description here

页面索引

不要介意此图片中显示的错误消息。由于我是从我的本地主机尝试过的,因此它没有证书。

可以使用服务器

enter image description here

答案 1 :(得分:1)

由于使用<Directory>上下文的副作用,您的规则不在“更新”中。每次替换都会再次开始处理。

当您请求/ promote-123并重写它以将数字放入查询字符串时,您无法匹配这些数字,就好像它们仍在路径中一样。您需要将重写路径和数字与RewriteCond%{QUERY_STRING}匹配(如果您关心数字)