【问题标题】:Mod Rewrite and PHPMod重写和PHP
【发布时间】:2009-04-26 04:49:39
【问题描述】:

我正在尝试使用 mod_rewrite 将页面重定向到带有一些变量的页面(用于将它们与 PHP 的 $_GET 一起使用)。

用几行举个例子:

  • 当用户输入/c/stg 时,它会重定向到item_show.php?id=$1&f=1(其中f 是页码)。
  • 当用户输入/c/stg/2 时,它会重定向到带有show.php?id=$1&f=$2 的第二页。

我认为我的文件中没有错误或滥用这些内容,但是,这就是我想要的:

我希望用户直接输入/stringitem_show.php?id=$1&f=1 $1 当然是我们的字符串...

但是当我通过从RewriteRule 中删除/c/ 部分来更改我的文件时,它开始在所有其他目录中给出错误并且不读取任何文件(my.css),即使我已经定义了RewriteCond %{REQUEST_FILENAME} !-f ...

你有什么建议吗? 或者我怎样才能用任何方法使这个系统成为可能?

Options FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#user
RewriteRule ^u/([^/]+)/?$ profile.php?username=$1 [L,NC]

#marked
RewriteRule ^marked/([^/]+)/?$ item_marked.php?id=$1 [L,NC]

#content
RewriteRule ^c/([^/]+)/?$ item_show.php?id=$1&f=1 [L,NC]
RewriteRule ^c/([^/]+)/([^/]+)/?$ item_show.php?id=$1&f=$2 [L,NC]

【问题讨论】:

  • 第一个建议:在里面贴出带有这些规则的文件内容。它是主服务器配置,还是 .htaccess 文件?
  • 当前 .htaccess 文件在这里: Options FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #user RewriteRule ^u/([^/]+)/? $ profile.php?username=$1 [L,NC] #marked RewriteRule ^marked/([^/]+)/?$ item_marked.php?id=$1 [L,NC] #content RewriteRule ^c/([^ /]+)/?$ item_show.php?id=$1&f=1 [L,NC] RewriteRule ^c/([^/]+)/([^/]+)/?$ item_show.php?id= $1&f=$2 [L,NC]
  • 删除 c/ 意味着所有 URL 都将匹配您的模式……这就是您的意思,对:> RewriteRule ^([^/]+)/?$
  • 是的,Nerdling 我的意思是,正如你所说,所有 URL 都匹配它,所以它不起作用..但我真的需要一个解决方案......

标签: php .htaccess mod-rewrite url-rewriting


【解决方案1】:

如果仅将 RewriteCond 传递给第一个 RewriteRule,我错了吗??

试试这个:

Options FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#user
RewriteRule ^u/([^/]+)/?$ profile.php?username=$1 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#marked
RewriteRule ^marked/([^/]+)/?$ item_marked.php?id=$1 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#content
RewriteRule ^c/([^/]+)/?$ item_show.php?id=$1&f=1 [L,NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ item_show.php?id=$1&f=$2 [L,NC]

干杯,

【讨论】:

  • 我很高兴我得了一分,所以我可以投票了。 :p 这里的很多问题都超出了我的知识范围。 :(
【解决方案2】:

RewriteCond 指令只属于RewriteRule 指令之后的第一个。因此,在您的情况下,这两个 RewriteCond 指令仅适用于第一个 RewriteRule 指令,而不适用于其他指令。

但如果请求可以映射到现有文件或目录,您可以使用此中止规则退出重写过程:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

这将导致只有在请求不能直接映射到现有文件或目录时才测试以下规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多