我有.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 文件。
最后更新:
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]
绝对 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]