htaccess将查询字符串附加到内部重定向


.htaccess appending query string to internal redirect

我试图在。htaccess中创建SEO友好的掩码重写。htaccess文件在本地主机和我的个人服务器上工作得很好,但不幸的是,似乎在GoDaddy的服务器上不起作用。我知道这已经是个问题了,但是我的客户打算用Godaddy作为他们的主机。

问题是,重写似乎是强制重定向显示重写的querystring在浏览器的URL栏,而不是保持它在内部。如:

规则:

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

Link: /images redirect to /images/?loadPage=images&mode=cms

这个"应该"保留为浏览器的/images/。我在下面复制了我的短.htaccess,为开发块修改的ip

<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]

一个潜在的提示是显示的url是/images/?query_string,而不是index.php?query_string,所以它没有做一个完整的重定向,尽管外部请求从页面请求接收301响应。

我没有测试任何东西,只是简单地看着那行…

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]

我已经注释掉了其他一些规则,这样您就可以知道发生了什么。您将获取任何不以"old"开头的内容并将其重写到旧目录中。前面的规则看起来就像你把所有找到"/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]