具有多个重写规则的.htaccess,基于路径

时间:2016-08-26 12:25:43

标签: apache .htaccess redirect mod-rewrite

我有以下.htaccess,它没有按预期工作:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^example.bg$
RewriteRule (.*) http://www.example.bg/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !^/sessiontest\.php$
RewriteCond %{REQUEST_URI} ^/login.* [OR]
RewriteCond %{REQUEST_URI} ^/admin.*$
RewriteRule ^(.*)$ travelpartner.php [L,NC]

RewriteCond %{REQUEST_URI} !^/sessiontest\.php$
RewriteCond %{REQUEST_URI} !^/login.*$
RewriteCond %{REQUEST_URI} !^/admin.*$
RewriteRule ^(.*)$ perla/$1 [L,NC]

我需要的是以下内容:

  1. 如果URI缺少example.bg中的“www”,则将其添加并重定向到www.example.bg
  2. 如果URI未以“sessiontest.php”结尾并以“www.example.bg/login”开头或以www.example.bg/admin开头,则将所有requets转发至travelpartner.php
  3. 对于所有其他情况,我们应将所有请求转发给名为“perla”的子文件夹
  4. 但是,现在发生的事情是我们总是看到perla子文件夹的内容,即使我打开exemple.bg/login

    我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

您可以使用以下规则

SomeFunction2

答案 1 :(得分:1)

根据您当前的规则,我获得了无限重定向循环:

一旦匹配规则No.2,并且请求/login被重写为/travelpartner.php,则重写的请求将被传递回URL解析引擎,并且规则集从一开始就再次运行。

这一次,它会匹配最后一段并被重写为/perla/travelpartner.php,然后再次发回,并重写为/perla/perla/travelpartner.php等......

如果请求以/perla开头或/travelpartner.php为<{1}},则修复将在最后一段中阻止重写:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^example.bg$
RewriteRule (.*) http://www.example.bg/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !^/sessiontest\.php$
RewriteCond %{REQUEST_URI} ^/login [OR]
RewriteCond %{REQUEST_URI} ^/admin
RewriteRule ^ travelpartner.php [L,NC]

RewriteCond %{REQUEST_URI} !^/sessiontest\.php$
RewriteCond %{REQUEST_URI} !^/login
RewriteCond %{REQUEST_URI} !^/admin
RewriteCond %{REQUEST_URI} !^/perla/
RewriteCond %{REQUEST_URI} !^/travelpartner\.php$
RewriteRule ^(.*)$ perla/$1 [L,NC]