我正在创建一个htaccess,我想要实现3件事:
css
,ico
,jpg
,js
,php
或png
文件的请求重定向到index.php a
开头,则目前它看起来像这样
RewriteEngine On
RewriteBase /test/
RewriteRule ^(.*)/$ $1 [N] # remove trailing slash
RewriteCond %{REQUEST_URI} !\.(css|ico|jpg|js|php|png)$ # if it isn't one of the files
RewriteRule . "index.php" [L] # then redirect to index
RewriteCond %{QUERY_STRING} !^a($|&) # if query doesn't start with a
RewriteRule . "view.php" [L] # then redirect to view
这样,以下测试用例应该是真的:
http://127.0.0.1/test/contact -> http://127.0.0.1/test/index.php
http://127.0.0.1/test/contact/ -> http://127.0.0.1/test/index.php
http://127.0.0.1/test/contact.png -> http://127.0.0.1/test/view.php
http://127.0.0.1/test/contact.png?a -> http://127.0.0.1/test/contact.png?a
当我在this site上尝试这些时,它会向我显示这些结果。实际上,当我尝试使用网址时,它会完全断开:
http://127.0.0.1/test/contact -> http://127.0.0.1/test/view.php
http://127.0.0.1/test/contact/ -> Error 500
http://127.0.0.1/test/contact.png -> http://127.0.0.1/test/view.php
http://127.0.0.1/test/contact.png?a -> http://127.0.0.1/test/contact.png?a
似乎脚本始终首先查看与查询相关的部分,尽管考虑到这一点,但/contact/
打破我仍然没有多大意义。当我删除与查询相关的部分时,其余部分确实有效。
我忘记了什么吗?是否有关于我不知道的操作顺序的规则?我输错了吗?
赞赏所有输入!
P.S。我知道我必须为所有本地图像,样式表,脚本和AJAX调用添加以a
开头的查询。我这样做是为了当人们在一个单独的标签中查看媒体时,我可以围绕它创建一个精美的页面,允许人们浏览服务器上公开存在的所有媒体。
答案 0 :(得分:3)
您的代码问题:
index.php
,然后没有?a
的任何内容都会路由到view.php
,因此最终不会使用index.php
一点都不对于没有.php
扩展名的任何内容,您需要在最后一条规则中使用否定条件。mod_rewrite
语法不允许内联注释。R
标记来更改浏览器中的网址。您可以在/test/.htaccess
:
RewriteEngine On
RewriteBase /test/
# if not a directory then remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [L,NE,R=301]
RewriteCond %{REQUEST_URI} !\.(css|ico|jpe?g|js|php|png)$
RewriteRule . index.php [L]
RewriteCond %{QUERY_STRING} !(^|&)a [NC]
RewriteRule !\.php$ view.php [L,NC]