Apache、htaccess、url 重写

Apache、htaccess、url 重写

我有.htaccess正在使用的文件供测试用,这是我的文件:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%{SERVER_NAME}/?title=%1 [L]

我在用着Apache/2.4.10(Win32)ApacheLounge

我有以下域和子域:

  • 示例.com
  • m.example.com

两者都指向同一个 IP 地址,正如我从上面所预期的那样.htaccess

如果我访问example.com/Article-Name/重定向example.com/?title=Article-Name内部的,我将无法?title=Article-Name在我的网址栏上看到。

以下是例外情况:

如果我访问m.example.com/Article-Name/重定向m.example.com/?title=Article-Name外部的现在我m.example.com/?title=Article-Name在我的 URL 栏中看到了。

所以我期待同样的行为,如果有人有想法我将不胜感激。

编辑:

我已经找到了该问题的解决方案,但我仍然对上述问题感兴趣,解决方案是使用:

RewriteRule ^ ?title=%1 [L]

请注意:此解决方案仅需要m.example.com,我真的不知道这个解决方案是如何工作的,我发布了这个解决方案,因为它可能有助于找到上述问题的原因,以及这个解决方案是如何工作的。

编辑2(完整的.htaccess 文件):

RewriteEngine On


<If "%{HTTP_HOST} = 'avielfadida.ml'">

# The actual condition is really long one so I replaced it for illustration.
RewriteCond %{HTTP_USER_AGENT} (iPhone|Blackberry|Android) [NC]

RewriteRule ^ http://m.%{HTTP_HOST}%{REQUEST_URI} [R,L]

# I have to duplicate the RewriteCond and RewriteRule both inside the <If> and <Else>
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]

RewriteRule ^ %{REQUEST_SCHEME}://%{HTTP_HOST}/?title=%1 [L]

# The solution(the solution is not required inside this block):
#RewriteRule ^ /?title=%1 [L]
</If>

<ElseIf "%{HTTP_HOST} = 'm.example.com'">

# I have to duplicate the RewriteCond and RewriteRule both inside the <If> and <Else>
RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%{HTTP_HOST}/?title=%1 [L]

# The solution(the solution is required here):
# RewriteRule ^ /?title=%1 [L]

DirectoryIndex /m/index.htm /m/index.php /m/index.html
</ElseIf>

重要的提示:完整的.htaccess 文件和问题之间没有关系,这次更新的原因是我犯了一个小错误,无论如何,我只使用问题中的 3 行测试了 .htaccess 文件。

这是 HTTPD.CONF 文件

最后更新:

RewriteEngine On    

# The actual condition is really long one so I replaced it for illustration.
RewriteCond %{HTTP_USER_AGENT} (iPhone|Blackberry|Android) [NC]

RewriteCond %{HTTP_HOST} !^m\.example\.com$ [NC]
RewriteRule .* http://m.example.com%{REQUEST_URI} [R,L]

RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule .* /?title=%1 [L]


<If "%{HTTP_HOST} = 'm.avielfadida.ml'">
    DirectoryIndex /m/index.htm /m/index.php /m/index.html
</If>

答案1

您使用相对路径的方式是正确的

RewriteRule ^ ?title=%1 [L]

Apache 文档

绝对 URL

如果指定了绝对 URL,mod_rewrite 将检查主机名是否与当前主机匹配。如果匹配,则删除方案和主机名,并将结果路径视为 URL 路径。否则,将对给定的 URL 执行外部重定向。要强制外部重定向回当前主机,请参见下面的 [R] 标志。

m.example.com将被视为不同的主机,因此 Apache 会执行外部重定向。因此,为了确保只执行内部重写,您需要使用相对路径,正如您所做的那样。

您还可以从 .htaccess 文件中删去很多内容。我认为这应该能满足您的要求。

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} (iPhone|Blackberry|Android) [NC]
RewriteCond %{HTTP_HOST} !^m\.example\.com$ [NC]
RewriteRule .* http://m.exmaple.com%{REQUEST_URI} [R,L]

RewriteCond %{REQUEST_URI} ^/([a-z-]+)/?$ [NC]
RewriteRule .* /?title=%1 [L]

相关内容