我正在使用htaccess脚本试图删除测试服务器上运行正常的.htaccess的.php,但在作为不同主机的实时服务器上,它尝试根据绝对路径重写文件重写失败
这是htaccess:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
这是一个像这样的网址www.example.com/services 并试图将其指向/n/c/example.com/public/service.php
我知道{REQUEST_FILENAME}假设是拉动完整的本地系统路径,但我不明白为什么它找不到文件。我对htaccess和mod_rewriting知之甚少,所以我不确定我应该尝试使其基于url路径的所有内容,或者是否有更好的解决方案。我很乐意接受建议。
非常感谢任何帮助。
由于
答案 0 :(得分:0)
您是否在其他服务器上启用了mod_rewrite?我想是AddModule mod_rewrite。
另外 - 更有可能 - 你启用了.htaccess吗?你需要
AllowOverride All
或
AllowOverride FileInfo
为此。
这些指令需要进入apache配置文件(通常是/etc/httpd/conf/httpd.conf或/etc/httpd/conf.d中的一个文件),你需要重启apache到让它们生效。
答案 1 :(得分:0)
使用RewriteRule .* %{REQUEST_URI}.php [L]
很难说明为什么你的规则不适合你,因为你对Apache的设置和你可能拥有的任何其他重写规则知之甚少。
[L]
标志很可能为你做了伎俩 - 你可能有其他重写规则进一步重写这个URL,最终产生不正确的结果。我不认为%{REQUEST_URI}
自己做了这么大的工作,除非你有一些符号链接/别名甚至是一些使用中可能有所作为的透明代理。
请注意,您在问题中显示的规则无法生成此类网址,以便在浏览器的地址栏中显示(example.com//service.php/
) - 它必须是涉及的重定向(3xx代码)。这表明你在其他地方有其他规则。
很可能是您的Apache特定设置和组合的组合。组合重写规则逻辑(其中L
标志可以根据其他规则产生很大的不同)。
提供更精确答案的唯一方法是启用重写调试并分析重写的执行方式和涉及的内容。