【问题标题】:.htaccess 500 error. RewriteRule not working as it should.htaccess 500 错误。 RewriteRule 无法正常工作
【发布时间】:2012-02-19 20:39:53
【问题描述】:

我的 .htaccess 重写器之一有问题: 服务器详情: 服务器运行 LiteSpeed Webserver 而不是 Apache,根据我的主机提供商的说法,它与 apache mod_rewrite 100% 兼容。
问题: 使用此代码时出现 500 内部服务器错误:

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  Options +Indexes  
   RewriteEngine On
   RewriteBase /
   RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
   RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
   RewriteRule ^(.*)$  %2/$1 [L,QSA,NC]
</IfModule>

当我使用此代码时,它几乎可以完成预期的工作,它将流量从任何子域重定向到具有文件请求的相应子文件夹。没有错误,没有什么,它可以正常工作,但它也会更改我不希望的浏览器地址。

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  Options +Indexes  
   RewriteEngine On
   RewriteBase /
   RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
   RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
   RewriteRule ^(.*)$  http://mysite.com/%2/$1 [L,QSA,NC]
</IfModule>

有什么想法吗?

Editetd:我想提一提的是,我使用通配符 DNS,子域实际上并不存在。 再次编辑: RewriteRule ^(.*)$ %2/index.php [L,QSA,NC] 如果我使用此规则并尝试访问 http://sub.mysite.com/whatever 它成功将其重定向到 http://mysite.com/sub/index.php 我不明白这就是为什么当我更改它们时它不能使用 $1 而不是 index.php 我得到 500 内部服务器错误。

现在得到解决方案:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
Options +Indexes  
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{HTTP_HOST} ^(.*)mysite\.com$ [NC]
RewriteCond   %{HTTP_HOST} !^www\.* [NC]
RewriteRule ^(.*)$ http://www.%1mysite.com/$1 [R=301,L,QSA] [NC]
RewriteCond %{HTTP_HOST}     !^www\.mysite\.com$              [NC]
RewriteCond %{HTTP_HOST}     ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteCond %2==$1           !^(.*)==\1                                        
RewriteRule ^(.*) %2/$1$2$3   [L,QSA,NC]
</IfModule>

【问题讨论】:

  • 服务器的 500 个错误检查错误日志 - 他们会告诉你一切。

标签: .htaccess mod-rewrite


【解决方案1】:

这是一个有趣的通用问题,值得通用解决方案,那么如何:

#
# Rule matches ('fred','','')    for pattern 'fred'
#              ('123','/',fred') for pattern '123/fred'
# At cond 2 %2 is the subdomain e.g. 123 for www.123.mysite.com
# Hence cond 3 pattern is 123==123 for www.123.mysite.com/123/fred
# and this will match ^(.*?)==\1 or fail its negation
#
RewriteCond %{HTTP_HOST}     !^www\.mysite\.com$              [NC]
RewriteCond %{HTTP_HOST}     ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteCond %2==$1           !^(.*?)==\1                                        
RewriteRule ^([^/]*)(/?)(.*) %1/$1$2$3                        [L]

【讨论】:

  • 现在重定向工作正常,但现在我发生了一件愚蠢的事情:)
  • 当我尝试访问测试子域中的 index.php 时,它会重定向到 domain.com/test/index.php 这正是我想要的。问题是,为了测试,我使用了类似于 domain.com 中的 index.php,只是我没有将 domain.com 索引的图像图片和 style.css 放在测试子文件夹中,但是当我访问测试时。 domain.com 第一次使用来自 domain.com 的 style.css,当我按下刷新时,我不再使用它,它只显示文本而没有 css,这是正常的。你能告诉我为什么它第一次使用 domain.com 的样式吗?
  • 我设法通过用 www 重写所有流量来解决这个问题。现在工作正常。非常感谢。
【解决方案2】:

我认为你的规则应该这样重写:

Options +FollowSymLinks -MultiViews
RewriteEngine on

RewriteCond %{HTTP_HOST} !^(www\.)?mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.mysite\.com$ [NC]
RewriteRule ^ http://mysite.com/%2%{REQUEST_URI} [L,P]

P 标志将使其充当代理,并将浏览器中的 URL 保留为 subdomain.mysite.com/whatever 而不是 mysite.com/subdomain/whatever

【讨论】:

  • Anubhava,我对您使用 [proxy] 标志很感兴趣。当然,这依赖于加载 mod_proxy 并且还需要适当的 ProxyPassReverse 指令支持。由于可能存在漏洞利用问题,大多数托管服务提供商和 LAMP 堆栈都会禁用 mod_proxy。
  • @TerryE:OP 想要在域名正在更改的地方进行重定向,但 OP 仍然不想要外部重定向,也不想更改浏览器的 URL。 IMO 'P' 是使它成为可能的唯一方法,因为 'R' 肯定会改变浏览器中的 URL。但是我不确定 OP 是否可以使用“P”。
  • 不工作,但无论如何感谢,顺便说一下,我使用通配符 dns 作为子域,我们在这里讨论的 .htaccess 文件位于主域的根目录中。
  • not working 对于试图回答您的问题的人来说绝不是一个有用的错误:) 您是否收到 500 个内部错误?或者你正在循环吗?请为我提供来自 Apache 的 error.log 或 access.log 的匹配行。
  • 这就是我在这里与@TerryE 讨论的内容。 P 标志可以提供此功能,但它需要启用 mod_proxy。
【解决方案3】:

这是因为它正在创建一个无限的重写循环。 123.mysite.com/ 被重写为 123.mysite.com/123/,后者被重写为 123.mysite.com/123/123/ 等等。

尝试使用它来防止此循环:

RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC]
RewriteRule ^(.*)$  %2/$1 [L,QSA,NC]

【讨论】:

  • 我只是不认为是这种情况,如果我将代码与mysite.com/%2/$1 一起使用,它就可以工作,实际上它工作得很好,但是正如我在我的问题中发布的那样,它会将网络浏览器重定向到mysite.com/subdomain_folder/whatever ...我希望只指向 mysite.com/subdomain_folder/whatever 并且在 webbrowser 中的地址栏应该指示 subdomain.mysite.com/whatever... 事实上我认为问题是服务器如何解释 $1 变量
  • 对不起,我从你的问题中复制了错误的代码。我编辑了它,它现在应该可以工作了。
  • 您不想将 REDIRECT_STATUS 条件提高一个,以便从 last RewriteCond 设置 %2 并为重写规则正确设置吗?
  • 愚蠢的我。感谢您发现@TerryE。再次编辑。对不起乔治。
  • 我很难过。我只是在我自己的服务器上对其进行了测试,以确保它可以正常工作。否 500。尝试将代码重新输入到新文件中,以确保文本中没有隐藏字符。否则恐怕我帮不了你。
猜你喜欢
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多