将mod-rewrite添加到现有的PHP网站

时间:2010-09-24 10:54:42

标签: php .htaccess mod-rewrite

我正在更新一个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 PHPMod-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的答案。问题已经解决。

4 个答案:

答案 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)

  1. 它会将您发送给root,因为您有RewriteBase /定义默认基础的内容... 如果你想留在子文件夹中,只需在RewriteBase /subfolder/子文件夹中创建另一个.htaccess 或删除它
  2. 你可以做出你想要的条件

    RewriteRule ^(([0-9]+)-)?page(-([0-9]+))?/?$    index.php?page=$2&id=$4 [L]
    
  3. 这会将您带到www.abcd.com/2-page-3www.abcd.com/index.php?page=2&id=3

    1. index.php中的代码不需要包含任何内容。

答案 3 :(得分:1)

根据经验,将mod_rewrite改编为现有网站比听起来更难。

这不是因为mod_rewrite很难 - 实际上设置它并使新URL工作相对容易。这很难的原因是因为您现有的网站会将所有旧网址硬编码到其中,因此您必须通过代码将所有网址更改为指向新的网址格式 - 如果您的代码可能会特别棘手动态构建URL字符串。你需要进行大量的测试,以确保你已经掌握了所有可能的变化,并且它们仍然有效。

另外值得一提的是,搜索引擎和外部网站将使用旧网址在您的网站上建立历史链接,因此您无法完全摆脱它们。

我知道这不能回答你的问题,但我相信在你开始这个项目之前要考虑这些是很重要的事情,因为对于一个现有的网站来说,并不是一些人能做到的快速解决方案。