mod_rewrite 与 ColdFusion 结合使用时有一个奇怪的问题:
我在我的虚拟主机配置中使用以下重写规则:
RewriteEngine On
RewriteRule ^$ index.cfm [L]
# Add trailing slash if missing
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(?i)^[\\/]CFFileServlet
RewriteCond %{REQUEST_URI} !index.cfm
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [L,R=301]
# Clean up multiple slashes in URL
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ [OR]
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(.*/)/+\sHTTP/[0-9.]+$
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L]
# Pass all non physically existing files/folders to index.cfm in URL.original_url
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/cms/
RewriteRule ^(.*)$ /index.cfm?original_url=$1 [QSA,PT,L]
一切正常,除了一件事:
如果我这样称呼http://www.example.com/test/?asdf
我的URL.original_url
阅读original_url=/test/index.php&asdf
,我无法弄清楚为什么会有索引。php在里面。
我已经尝试省略了 PT 标志,但没有它就无法工作。所有页面,例如http://www.example.com/test/
返回403 - Forbidden
,并且在页面标题中显示“JRun Servlet 错误”。
感谢您对此的任何想法!
编辑:
好的,我错过了一些重要的事情:该文件夹/test/
实际上存在于我的 documentroot 中!/test/does_not_exist/
其他类似的URL不受上述问题的影响。
总结:
http://www.example.com/test/
->URL.original_url
得到/test/index.php
http://www.example.com/test/does_not_exist/
->URL.original_url
得到/test/does_not_exist/
这是我的预期行为。