【问题标题】:Why does my .htaccess not redirect properly from a subfolder?为什么我的 .htaccess 不能从子文件夹正确重定向?
【发布时间】:2014-08-08 16:22:58
【问题描述】:

我创建了一个 .htaccess 文件来从域中删除 www 前缀,并通过引导程序 (index.php) 发送所有请求。这里是:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
</IfModule>

我的问题是,如果网站包含在子文件夹中,重定向会将用户发送到根文件夹并且重定向会中断。

示例:用户访问“www.example.com/website/news” -> 重定向到“example.com/news”(应为“example.com/website/news”)

有人知道如何解决这个问题吗?

【问题讨论】:

  • 您的 .htaccess 文件在哪里,是否在 website 子文件夹中?那么你可能需要设置一个合适的RewriteBase

标签: php apache .htaccess mod-rewrite


【解决方案1】:

您可以使用REQUEST_URI 变量而不是$1 来解决此问题:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L,NE]

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
</IfModule>

【讨论】:

  • 我认为这个实际上会起作用。看起来不错....但是我的浏览器中出现“页面未正确重定向”
  • 具体来说,它似乎没有删除 www。并且一遍又一遍地不断重定向到规则。
  • 你明白了。这似乎解决了它。非常感谢!
【解决方案2】:

测试这条规则

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subfolder/index.php?url=$1 [L,QSA]
</IfModule>

【讨论】:

  • 感谢您的回复! :) 虽然这可能会奏效,但我希望有一个更动态的解决方案,它会影响子文件夹内的网站和非子文件夹内的网站,这样我每次移动网站时都不必编辑 htaccess。如果我无法弄清楚,我会选择你的解决方案。
  • 好的,您想要动态解决方案吗?但你必须在你拥有所有 php 代码的文件夹中具体说明
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
相关资源
最近更新 更多