使用条件和查询字符串重定向奇怪

时间:2011-08-16 14:35:57

标签: php apache .htaccess

这基本上就是我要做的事情:

  • 如果访问者请求的URL指向文件或目录,则显示该文件
  • 否则,重定向回index.php文件

下面的.htaccess文件效果很好;我面临的唯一问题是,如果访问者请求的URL是带有$ _GET参数的PHP文件,则它们将被带到index.php文件而不是它们应该去的文件。关于如何解决这个问题的任何想法?

# Prevent "Index Of" pages
Options -Indexes 

# Rewrite
RewriteEngine on

# Rewrite www to non-www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

# If requested resource exists as a file or directory, go to it
RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule (.*) - [L]

# Else rewrite requests for non-existent resources to /index.php
RewriteRule (.*) /index.php?url=$1

3 个答案:

答案 0 :(得分:1)

Apache通常会切断查询字符串。要附加它,qsappend标志(QSA)应该包含在所有的rewriteRule行中,如下所示:

# Prevent "Index Of" pages
Options -Indexes 

# Rewrite
RewriteEngine on

# Rewrite www to non-www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L,QSA]

# If requested resource exists as a file, do not rewrite.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php?url=$1 [QSA]

//编辑:您明确地将现有文件重写为自己。只是不要这样做,但如果您的URL命中现有文件,请挽救。 (上面编码的代码。)

答案 1 :(得分:1)

问题

# If requested resource exists as a file or directory, go to it
RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule (.*) - [L]

你是不是可能在文件系统上寻找像“somepath.php?querystring”这样的文件呢?我认为$1包含查询字符串。

所以这些条件失败了,你会陷入最后的重写规则。用户被发送到index.php,但由于您没有使用[QSA],他们会丢失赠品查询字符串。


解决方案

尝试:

# If requested resource exists as a file or directory, go to it
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*) - [QSA,L]

不要忘记[QSA]以保留查询字符串(如果存在)。

您也应该将其添加到最终规则中:

# Else rewrite requests for non-existent resources to /index.php
RewriteRule (.*) /index.php?url=$1 [QSA]

建议

您确定要进行无操作重写吗?这有点奇怪。

如何否定逻辑并结合这两条规则?像这样:

# If requested resource doesn't exist as a file or directory, rewrite to /index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php?url=$1 [QSA,L]

答案 2 :(得分:-1)