2013-06-04 84 views
6

我试图在.htaccess中创建SEO友好的蒙面重写。 htaccess文件在localhost和我的个人服务器上工作正常,但不幸的是在GoDaddy的服务器上不起作用。我知道那已经是一个问题了,但是正在为使用Godaddy作为主持人的客户工作。.htaccess将查询字符串附加到内部重定向

问题是,重写似乎强制重定向显示浏览器URL栏中重写的查询字符串,而不是将其保留在内部。 例如。

规则:

RewriteRule ^/?([a-zA-Z0-9-_/]*)$ /index.php?loadPage=$1&mode=cms [L,QSA] 

链接:/images重定向到/images/?loadPage=images&mode=cms

这个“应该”留为/images/的浏览器。我抄我的短低于.htaccess,修改为开发区块

<Files .htaccess> 
    deny from all 
</Files> 

Options -MultiViews +FollowSymlinks -Indexes 

RewriteEngine On 
RewriteBase/

# Stop Old redirection from block below 
RewriteCond %{REQUEST_URI} "/old/" 
RewriteRule (.*) $1 [L] 

# Under construction Redirect 
RewriteCond %{REMOTE_ADDR} !^0.0.0.0 
RewriteCond %{REQUEST_URI} !^/?old/ 
RewriteRule ^/?(.*) “/old/$1″ [L,QSA] 

#Admin utilities rewrite 
RewriteRule ^/?admin/?(.*)$ /index.php?loadPage=$1&mode=backend [L,QSA] 

#CMS/Frontend rewrites -- this one is failing 
RewriteRule ^\/?([a-zA-Z0-9-_]+)\/?$ /index.php?loadPage=$1&mode=cms [QSA,L] 
IP地址

潜在笔记的提示是,所显示的网址是/images/?query_string,NOT index.php?query_string,所以它不是做了充分的重定向,尽管外部请求被接受来自页面请求的301响应。

+0

请参考以下链接或者你也可以contect支持团队http://support.godaddy.com/groups/web-hosting/forum/topic/problem-using-htaccess-for-url-rewrite/和http://support.godaddy.com/groups/web-hosting/forum/topic/how-do-i-use-htaccess-to-redirect-my-document-root-and-mask-the-url/? sid =&sp = 1 –

+0

感谢您的链接,不幸的是我调查了他们两人,似乎都不适用于我的情况。 –

回答

2

我没有测试过什么,但只是在看这条线......

RewriteRule ^\/?([a-zA-Z0-9-_]+)\/?$ /index.php?loadPage=$1&mode=cms [QSA,L] 

有语法错误。 9之后的连字符应该作为范围指示符在技术上逃脱。大多数时候你看到人们把它放在]之前的末尾,所以它不会导致错误,所以大多数人认为他们不必逃避它。你也不需要逃避正斜杠。还使用问号使先前的可选,并不知道你为什么要这样做。所以它应该是这样的:

RewriteRule ^([a-zA-Z0-9\-_]+)/?$ /index\.php?loadPage=$1&mode=cms [QSA,L] 
+0

可选的结束斜杠是因为如果斜线后面没有任何内容(与安全性有关),某些“奇妙”浏览器插件会从链接中删除尾部斜杠。奇怪的是,如果我使用尾部斜线访问,重写确实能够正常工作,但如果它不存在则无法工作。原来的管理员重写的是相同的事情(只是比较挑剔),并且完美地工作,所以我认为你的东西与匹配值的解释方式有关。我会做更多的尝试。 (不幸的是,建议的更改并未改变问题)。 –

+0

我为任何没有尾部斜杠的传入链接添加301重定向来追加它,并获得了我希望他们遵循的规则。宁愿有一个规则可选,但它至少工作,哈哈。感谢您让我走上正轨! –

0

我已经评论了一些其他规则,所以你可以告诉发生了什么。你正在采取任何不以“旧”开头并将其重写到旧的目录。前面的规则看起来像是在您找到'/ old /'这个词的所有地方,并且您将它重定向到自己。您不应该收到0.0.0.0的任何请求。

最后一条规则中的连字符需要转到括号的末尾,以便Apache不查找范围。

由于我们正在处理.htaccess如果我们不使用REQUEST_URI,我们不需要上述斜杠。

RewriteEngine On 
RewriteBase/

# Stop Old redirection from block below 
RewriteCond %{REQUEST_URI} ^/old/(.*)$ 
RewriteRule .* %1 [L] 

# Under construction Redirect 
# RewriteCond %{REMOTE_ADDR} !^0.0.0.0 
# RewriteCond %{REQUEST_URI} !^/?old/ 
# RewriteRule ^/?(.*) /old/$1 [L,QSA] 

#Admin utilities rewrite 
RewriteRule ^admin/(.*)$ index.php?loadPage=$1&mode=backend [L,QSA] 

#CMS/Frontend rewrites 
RewriteCond %{REQUEST_FILENAME} !^index.php$ 
RewriteRule ^([A_Za-z0-9_-]+)/?$ index.php?loadPage=$1&mode=cms [QSA,L] 
+0

0.0.0.0 IP是我从开发中访问服务器的IP的占位符。我同意我对连字符有点懒,但是由于没有以下范围字符,所以Apache通常可以找出它。我已经测试了这些更改,不幸的是问题仍然存在。除了RewriteEngine和前端重写之外,我还评论过每一条规则,并且结果仍然是相同的,所以它似乎没有规则冲突。 –

相关问题