这基本上就是我要做的事情:
下面的.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
答案 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)