我正在更新一个php应用程序,目前不使用url重写。目的是隐藏文件扩展名。网站的一般结构如下
root/
index.php
login.php
page1.php
page2.php
page3.php
page4.php
page5.php
page6.php
page7.php
page8.php
subfolder/
index.php
validpage.php
images/
css/
上述结构中的子文件夹文件夹是唯一的,因为它是唯一包含php文件的子文件夹。所有其他文件都在根文件夹中。
我已经完成了这些问题Mod Rewrite and PHP和Mod-Rewrite or PHP router?以及mod_rewrite, php and the .htaccess file
更新了 htaccess。感谢@thomasmalt
RewriteEngine on
RewriteBase /
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -l
RewriteRule ^.*$ - [NC,L]
# only rewrite if the requested file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-s
# add .php to the url
RewriteRule ^(.*)$ $1.php
当我尝试访问像localhost / inex.php这样的不存在的页面时,问题是我得到500而不是404错误。 Apache错误日志给出了以下错误。 (我访问了localhost / index,它载入了index.php的内容,然后我加载了localhost / inex,这给了我一个500错误。)
[Sat Sep 25 14:44:26 2010] [error] [client 127.0.0.1] File does not exist: C:/wamp/www/index
[Sat Sep 25 14:44:36 2010] [error] [client 127.0.0.1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
更新:找到问题here的答案。问题已经解决。
答案 0 :(得分:3)
Apache有一个选项:Options + MultiViews
如果启用此功能,则无需将文件扩展名放在网址中。
答案 1 :(得分:2)
我不完全确定你想要实现什么,我怀疑,没有任何不尊重的意图,你需要理解mod_rewrite,以及webserver和php解析和执行文件的方式。我不确定如果没有在你的理解水平之上或之下进行拍摄会怎么回答,但我会尝试。
我可以告诉你你当前的情况.htaccess正在做什么:(伪代码)
if REQUEST_FILENAME does not exist then
rewrite request to /index.php/<the request>
因为index.php是你执行的php脚本,所以放入$ 1的所有东西都会被忽略。 这就是为什么无论你做什么就会执行index.php的原因。
您可以尝试将.htaccess放入:
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^(.*)$ $1.php
那应该接受请求并尝试将.php附加到它的末尾。不幸的是我没有测试过,但是你应该试一试。结果应该是这样的:
if request is "/news/article"
translate it to "/news/article.php"
你应该每天两次阅读mod_rewrite文档一个月,并购买关于正则表达式的O'Reilly书。
如果您具有开发服务器的管理员权限,则应该查看
RewriteLogLevel
RewriteLog
答案 2 :(得分:1)
RewriteBase /
定义默认基础的内容...
如果你想留在子文件夹中,只需在RewriteBase /subfolder/
子文件夹中创建另一个.htaccess
或删除它你可以做出你想要的条件
RewriteRule ^(([0-9]+)-)?page(-([0-9]+))?/?$ index.php?page=$2&id=$4 [L]
这会将您带到www.abcd.com/2-page-3
到www.abcd.com/index.php?page=2&id=3
index.php
中的代码不需要包含任何内容。答案 3 :(得分:1)
根据经验,将mod_rewrite改编为现有网站比听起来更难。
这不是因为mod_rewrite很难 - 实际上设置它并使新URL工作相对容易。这很难的原因是因为您现有的网站会将所有旧网址硬编码到其中,因此您必须通过代码将所有网址更改为指向新的网址格式 - 如果您的代码可能会特别棘手动态构建URL字符串。你需要进行大量的测试,以确保你已经掌握了所有可能的变化,并且它们仍然有效。
另外值得一提的是,搜索引擎和外部网站将使用旧网址在您的网站上建立历史链接,因此您无法完全摆脱它们。
我知道这不能回答你的问题,但我相信在你开始这个项目之前要考虑这些是很重要的事情,因为对于一个现有的网站来说,并不是一些人能做到的快速解决方案。