除非首字母大写,否则Mod_rewrite不适用于某些规则? HTTPS服务器

时间:2016-01-23 00:52:00

标签: php apache .htaccess mod-rewrite https

我已经在这个网站上工作了很长一段时间。我使用.htaccess文件来获取干净的URL。这在我的个人测试服务器(http和我的本地主机)上工作正常,但在移动到生产服务器(启用HTTPS并正常工作)后,某些规则无效

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^index/?$  index.php [NC,L] 
  RewriteRule ^home/?$  index.php [NC,L] 
  RewriteRule ^main/?$  index.php [NC,L] 
  RewriteRule ^about/?$  about.php [NC,L] 
  RewriteRule ^music/?$  music.php [NC,L] 
  RewriteRule ^shows/?$  shows.php [NC,L] 
  RewriteRule ^blog/?$  blog.php?page=1 [NC,L] 
  RewriteRule ^blog/([\0-9]+)/?$   blog.php?page=$1   [NC,L]
  RewriteRule ^contact/?$  contact.php [NC,L] 
  RewriteRule ^profile/?$  profile.php [NC,L] 
  RewriteRule ^manage-site/?$  manage-site.php [NC,L] 
  RewriteRule ^my-blog-posts/?$  my-blog-posts.php [NC,L] 
  RewriteRule ^new-blog-post/?$    new-blog-post.php   [NC,L]
  RewriteRule ^edit-music/?$  edit-music.php [NC,L] 
  RewriteRule ^admin-login/?$    admin-login.php   [NC,L]  
  RewriteRule ^admin/?$    admin-login.php   [NC,L]  
  RewriteRule ^forgot-password/?$   forgot-password.php [NC,L]
  RewriteRule ^password-reset/?$    password-reset.php [NC,L]


  RewriteRule ^blog/article/([\w-]+)/?$   blog-post.php?slug=$1   [NC,L]  #handle requests for Individual Blog Posts
  RewriteRule ^blog/article/([\w-]+)/([^/\.]+)/?$   blog-post.php?slug=$1&reply-comment=$2   [NC,L]  #handle requests for Individual Blog Posts with a comment specified for replies when JavaScript is disabled
  RewriteRule ^password-reset/([^/]+)/?$  password-reset.php?token=$1   [NC,L] #handle requests for password-reset.php with the token included in a nicer-looking url
</IfModule>

ErrorDocument 404 /404.php

基本上任何带有连字符的规则,即manage-site,都会给我404错误,除非我把它大写,即管理网站 - 这很好。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果为此目录启用了MultiViews(mod_negotiation),则可能会发生这种情况。尝试通过将以下内容添加到.htaccess文件的顶部来禁用MultiViews

Options -MultiViews

关于问题中的代码,可能会失败的情况(即结果为404)是指您使用一个尾随斜杠和< / em>存在一个具有相同基本名称​​且 AcceptPathInfoOff的PHP文件。例如,example.com/main/应该重写为/main.php,而是重写为/main.php/(通过mod_negotiation),这会产生404。

默认情况下,许多服务器上通常会启用

MultiViews,但默认的Apache安装不应该启用此功能。

启用MutliViews后,Apache会尝试通过测试各种文件扩展名(将返回适当的mime类型)来映射文件系统上不存在的文件。例如。请求/main(不存在),它会尝试/main.php - 成功。但是,这会在 mod_rewrite之前运行,因此如果MultiViews启动,mod_rewrite规则将永远不会匹配。

在上面提到的场景中,/main/也会触发mod_negotiation,在内部将请求重写为/main.php/(尾部斜杠仍在尾随)。但如果AcceptPathInfo为Off,则会触发404.这会阻止mod_rewrite重写URL。

通过大写请求,MultiViews失败(我假设你是一个区分大小写的操作系统,例如Linux?),但是因为NC上有RewriteRule标志这现在有效。