在我的站点www.sqcp.com
上,在另一台linux服务器上进行测试时,一切都正常工作。然而,自从将其移到godaddy后,mod_rewrites就一直无法工作,因此其他页面都无法访问。即使我在中创建了一个空白目录/文件夹,它试图将url整理到其中,也适用于该页面(显然不是一个修复方法)。
因此,在我的.htaccess
文件中,任何帮助都会很好。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ / [L,R=301]
RewriteRule (.*)/{2,}$ /$1/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^GET /[^?s]+.php
RewriteRule (.*).php$ /$1/ [L,R=301]
RewriteRule ^(.*)/(d{4}-d{2}-d{2}-[a-zA-Z0-9-_]+)$ $1?s=$2 [L]
RewriteRule ^(.*/)?staff.php/([a-zA-Z0-9-_]+) $1staff.php?s=$2 [L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*)/$ $1.php [L]
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule (.*)/$ $1 [L]
</IfModule>
Godaddy运行着一个非常好的共享托管服务,解决了一个庞大的市场领域——那些想要一个活动站点(即使用一些脚本)的用户,但不需要支付费用或复杂性,也不需要拥有管理自己的Linux虚拟机的专业知识。这不是GoDaddy的问题。这是你的。
因此,首先通过运行phpinfo
脚本来了解您正在运行的环境,并确保它创建了您使用的变量。就我在你的例子中所见:
规则1-3是301重定向,以强制执行某些请求命名约定。
- 规则1将
/index.php
重定向到/
- 规则2将尾随的多个
/
折叠为单个/
- 规则3将
*.php
的GET请求重写为*.php/
规则4-6将公共URI映射到内部URI
- 规则4将
/*/yyyy-mm-dd-word
重写为*?s=yyyy-mm-dd-word
(注意没有QSA) - 规则5似乎试图将
/*/staff.php/word
重写为/*/staff.php?s=word
,但语法错误 - 规则6在重定向时用
.php
替换任何尾随的/
- 规则7去掉任何尾随的"/",除非uri是一个带有index.php的目录(我假设你假设的是
DirectoryIndex index.php
(GoDaddy是这样吗?)
这一切都是令人绝望的困惑。您是否隐藏或暴露了.php
扩展?因为规则3、5和6不一致。第5条规则似乎更符合
RewriteRule ^(.*?)/staff.php/([a-zA-Z0-9-_]+) $1/staff.php?s=$2 [L]
回到绘图板上,计算出你试图用你的htaccess规则做什么;您希望您的公共URI语法是什么;脚本的布局方式;您希望传递回客户端浏览器的重定向,希望Apache作为内部重写处理的重定向,以及需要哪些额外条件来防止循环和不匹配。确保这是有意义的,然后通过一次一个规则地构建.htaccess
文件并使用测试请求依次练习每个规则来验证它的作用来调试它们。
尝试在htaccess文件的开头添加以下内容。我在GoDaddy上也遇到了同样的问题,它在其他地方都有效:
Options -Multiviews