我已经在这个网站上工作了很长一段时间。我使用.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错误,除非我把它大写,即管理网站 - 这很好。
有什么想法吗?
答案 0 :(得分:2)
如果为此目录启用了MultiViews
(mod_negotiation),则可能会发生这种情况。尝试通过将以下内容添加到.htaccess文件的顶部来禁用MultiViews
:
Options -MultiViews
关于问题中的代码,可能会失败的情况(即结果为404)是指您使用一个尾随斜杠和< / em>存在一个具有相同基本名称且 AcceptPathInfo
为Off
的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
标志这现在有效。