.htaccess 的奇怪行为
Weird behavior with .htaccess
我是重写规则的新手,我的 .htaccess 遇到了一个小问题
RewriteEngine On
RewriteRule ^toto\.html$ /toto.php [NC,L]
RewriteCond %{REQUEST_URI} !^/(my|your)/template\.html [NC]
RewriteCond %{REQUEST_URI} !^/(my|your)/example\.html [NC]
RewriteRule ^([^/]*)/([^/]*)/([^\.]*)\.html$ /.php?type=&name= [NC,L]
RewriteRule ^([^/]*)/([^\.]*)\.html$ /index.php?type=&name= [L]
RedirectMatch 404 \.(htaccess|htpasswd|ini|log|sh|inc|bak|bkp|sql|json)$
我在 https://htaccess.madewithlove.be/ 上测试了它,它总是给我正确的重写。
当我在我的虚拟主机上测试它时:
我去http://mydomain.ovh/my/object.html
重写是对:http://mydomain.ovh/index.php?type=my&name=object
但是当我去
- http://mydomain.ovh/write/my/object.html
- http://mydomain.ovh/extract/my/object.html
- http://mydomain.ovh/fill/your/object.html
- http://mydomain.ovh/write/your/data.html
- http://mydomain.ovh/extract/your/data.html
重写 错误 : 请求的 URL /redirect:.php 在此服务器上找不到。
我不明白这种行为...
所以我测试了新的重写规则,为 write/fill 操作制作了一个通用脚本:
RewriteEngine On
RewriteRule ^toto\.html$ /toto.php [NC,L]
RewriteCond %{REQUEST_URI} ^/extract/(my|your)/[^\.]+\.html$ [NC]
RewriteRule ^([^/]*)/([^/]*)/([^\.]*)\.html$ /extract.php?type=&name= [L]
RewriteCond %{REQUEST_URI} !^/extract.* [NC]
RewriteCond %{REQUEST_URI} !^/(my|your)/template\.html [NC]
RewriteCond %{REQUEST_URI} !^/(my|your)/example\.html [NC]
RewriteRule ^([^/]*)/([^/]*)/([^\.]*)\.html$ /set.php?type=&name= [NC,L]
RewriteRule ^([^/]*)/([^\.]*)\.html$ /index.php?type=&name= [L]
RedirectMatch 404 \.(htaccess|htpasswd|ini|log|sh|inc|bak|bkp|sql|json)$
我在 https://htaccess.madewithlove.be/ 上测试了它,它总是给我正确的重写。
当我在我的虚拟主机上测试它时:
我去http://mydomain.ovh/my/object.html
重写是对:http://mydomain.ovh/index.php?type=my&name=object
我去 http://mydomain.ovh/fill/my/object.html 或 http://mydomain.ovh/write/your/data.html
重写是对:http://mydomain.ovh/set.php?type=my&name=object or http://mydomain.ovh/set.php?type=your&name=data
但是当我去 http://mydomain.ovh/extract/my/object.html 或 http://mydomain.ovh/extract/your/data.html
重写总是错误:请求到达脚本但没有查询字符串...(它似乎是重定向?)
["PATH_TRANSLATED"]=>
string(19) "redirect:/index.php"
["PATH_INFO"]=>
string(30) "/my/object.html"
["SCRIPT_NAME"]=>
string(11) "/extract.php"
["REQUEST_URI"]=>
string(37) "/extract/my/object.html"
["QUERY_STRING"]=>
string(0) ""
["PHP_SELF"]=>
string(41) "/extract.php/my/object.html"
有人可以帮助修改这些重写规则吗?
您需要关闭 .htaccess 顶部的选项 MultiViews
,它似乎已在 Apache 配置中为您的网站打开。
将此添加到您的 .htaccess 顶部:
Options -MultiViews
选项 MultiViews
(参见 http://httpd.apache.org/docs/2.4/content-negotiation.html)由 Apache's content negotiation module
使用,它在 之前 mod_rewrite
运行并使 Apache 服务器匹配文件的扩展名。因此,如果 /file
是 URL 那么 Apache 将提供 /file.html
.
进行此更改后,请在新浏览器中进行测试以避免旧浏览器缓存。
我是重写规则的新手,我的 .htaccess 遇到了一个小问题
RewriteEngine On
RewriteRule ^toto\.html$ /toto.php [NC,L]
RewriteCond %{REQUEST_URI} !^/(my|your)/template\.html [NC]
RewriteCond %{REQUEST_URI} !^/(my|your)/example\.html [NC]
RewriteRule ^([^/]*)/([^/]*)/([^\.]*)\.html$ /.php?type=&name= [NC,L]
RewriteRule ^([^/]*)/([^\.]*)\.html$ /index.php?type=&name= [L]
RedirectMatch 404 \.(htaccess|htpasswd|ini|log|sh|inc|bak|bkp|sql|json)$
我在 https://htaccess.madewithlove.be/ 上测试了它,它总是给我正确的重写。
当我在我的虚拟主机上测试它时:
我去http://mydomain.ovh/my/object.html
重写是对:http://mydomain.ovh/index.php?type=my&name=object
但是当我去
- http://mydomain.ovh/write/my/object.html
- http://mydomain.ovh/extract/my/object.html
- http://mydomain.ovh/fill/your/object.html
- http://mydomain.ovh/write/your/data.html
- http://mydomain.ovh/extract/your/data.html
重写 错误 : 请求的 URL /redirect:.php 在此服务器上找不到。
我不明白这种行为...
所以我测试了新的重写规则,为 write/fill 操作制作了一个通用脚本:
RewriteEngine On
RewriteRule ^toto\.html$ /toto.php [NC,L]
RewriteCond %{REQUEST_URI} ^/extract/(my|your)/[^\.]+\.html$ [NC]
RewriteRule ^([^/]*)/([^/]*)/([^\.]*)\.html$ /extract.php?type=&name= [L]
RewriteCond %{REQUEST_URI} !^/extract.* [NC]
RewriteCond %{REQUEST_URI} !^/(my|your)/template\.html [NC]
RewriteCond %{REQUEST_URI} !^/(my|your)/example\.html [NC]
RewriteRule ^([^/]*)/([^/]*)/([^\.]*)\.html$ /set.php?type=&name= [NC,L]
RewriteRule ^([^/]*)/([^\.]*)\.html$ /index.php?type=&name= [L]
RedirectMatch 404 \.(htaccess|htpasswd|ini|log|sh|inc|bak|bkp|sql|json)$
我在 https://htaccess.madewithlove.be/ 上测试了它,它总是给我正确的重写。
当我在我的虚拟主机上测试它时:
我去http://mydomain.ovh/my/object.html
重写是对:http://mydomain.ovh/index.php?type=my&name=object
我去 http://mydomain.ovh/fill/my/object.html 或 http://mydomain.ovh/write/your/data.html
重写是对:http://mydomain.ovh/set.php?type=my&name=object or http://mydomain.ovh/set.php?type=your&name=data
但是当我去 http://mydomain.ovh/extract/my/object.html 或 http://mydomain.ovh/extract/your/data.html
重写总是错误:请求到达脚本但没有查询字符串...(它似乎是重定向?)
["PATH_TRANSLATED"]=>
string(19) "redirect:/index.php"
["PATH_INFO"]=>
string(30) "/my/object.html"
["SCRIPT_NAME"]=>
string(11) "/extract.php"
["REQUEST_URI"]=>
string(37) "/extract/my/object.html"
["QUERY_STRING"]=>
string(0) ""
["PHP_SELF"]=>
string(41) "/extract.php/my/object.html"
有人可以帮助修改这些重写规则吗?
您需要关闭 .htaccess 顶部的选项 MultiViews
,它似乎已在 Apache 配置中为您的网站打开。
将此添加到您的 .htaccess 顶部:
Options -MultiViews
选项 MultiViews
(参见 http://httpd.apache.org/docs/2.4/content-negotiation.html)由 Apache's content negotiation module
使用,它在 之前 mod_rewrite
运行并使 Apache 服务器匹配文件的扩展名。因此,如果 /file
是 URL 那么 Apache 将提供 /file.html
.
进行此更改后,请在新浏览器中进行测试以避免旧浏览器缓存。