【问题标题】:Apaches mod_rewrite issuesApaches mod_rewrite 问题
【发布时间】:2012-06-07 19:56:10
【问题描述】:

我遇到了 apaches mod_rewrite 的问题。我想用我的 php 应用程序创建干净的 url,但它似乎没有给出我期望的结果。

我在我的 .htaccess 文件中使用此代码:

RewriteEngine on
RewriteRule ^project/([0-9]{4})/([0-9]{2})$ /project/index.php?q=$1&r=$2 [L]
RewriteRule ^project/([0-9]{4})$ /project/index.php?q=$1 [L]

这样当我查看http://localhost/user/project/system 时,就相当于查看http://localhost/user/project/index.php?q=system

我没有得到任何结果,而是得到一个典型的 404 错误。

我还刚刚检查了 mod_rewrite 是否可以通过将我的 .htaccess 代码替换为以下代码:

Options +FollowSymLinks
RewriteEngine On
RewriteRule (.*) http://www.stackoverflow.com

它正确地将我重定向到这里,所以 mod_rewrite 肯定是有效的。

我的项目的根路径是/home/user/public_html/project

用于查看我的项目的网址是http://localhost/user/project

如果需要更多信息,请告诉我。

谢谢

【问题讨论】:

  • 如果删除目标路径中的前导/ 会发生什么?
  • .htaccess 文件在哪里?如果已经在 project/ 文件夹中,则在 RewriteRule 中提及它将不起作用。
  • @Emil - 据我所知,什么都没有。
  • @mario - 是的,我该怎么办?

标签: php apache mod-rewrite


【解决方案1】:

如果您的.htaccess 文件确实已经位于project/ 子目录中,则不要在RewriteRule 中再次提及它。删除它:

RewriteRule ^([0-9]{4})/([0-9]{2})$ /project/index.php?q=$1&r=$2 [L]
# no "project/" here

规则始终与当前本地文件名映射相关。

使用RewriteBase 进行其他实验。

【讨论】:

  • 我试过从这里开始:RewriteEngine onRewriteRule ^([a-zA-Z0-9])$ index.php?component=$1[L] 但它只让我有一个整数或字符(不管哪个),如果我还有它会给我一个 404 页。所以http://localhost/user/project/fhttp://localhost/user/project/1http://localhost/user/project/Q 都可以工作,http://localhost/user/project/system 不行。
  • 这个之前已经给你解释过了。使用量词+
  • 是的,你是对的。对不起我今天的愚蠢。我对正则表达式一无所知。我已经将 + 添加到了结束括号的外部,这似乎可以解决问题。感谢您的时间和帮助,非常感谢。
【解决方案2】:

您的正则表达式中有 [0-9]{4},它将仅匹配 4 位数字。但是,“系统”不是 4 位数字,因此不匹配。

您可以改用 [^/]+ 之类的东西。

RewriteRule ([^/]+)/([0-9]{2})$ /index.php?q=$1&r=$2 [L]
RewriteRule ([^/]+)$ /index.php?q=$1 [L]

不知道第二个参数是否应该是2位数字。

编辑:我现在还在开头添加了“用户”。

Edit2: 好的,我以为你的 htaccess 在根 htdocs 中。因此,如果您在带有 .htaccess 的“项目”中,请删除“项目”和“用户”。

【讨论】:

  • 不,在那里也不重要。那是我的错,问题是教程中没有解释。我也发布了错误的代码,0-9 是 a-z。我试过你的代码,但我收到了 404。
  • 我看到的另一件事是您前面有“用户”。我更新了我的答案,请试试这个。
  • 我开始认为它只是我的服务器,我将目录符号链接的方式可能会导致此问题或 httpd.conf 中未正确设置的内容。我试过你的代码,它应该可以工作,但它仍然给了我一个 404。如果 .htacess 放在 /user/projects 内,有没有办法将该目录确定为主路径,并且必须定义用户和项目目录?
  • 你试过去掉开头的^吗? (我猜没有“用户”)。从项目开始。
  • [a-z]+ 匹配 a-z 中至少有一个字符。 [a-z]{4} 仅匹配 4 个字符串。 [^/]+ 匹配包含至少一个字符且不包含斜杠 /.的字符串。
【解决方案3】:

你可能是说

RewriteRule ^/project/([0-9]{4})/([0-9]{2})$ /project/index.php?q=$1&r=$2 [L] 
RewriteRule ^/project/([0-9]{4})$ /project/index.php?q=$1 [L] 

'^project' 的意思是“行首是 'project'”,但开头是 '/project',因此您需要包含起始斜线(即 '^/project...')。


抱歉,错过了系统位(和用户位)。正专注于斜线。

RewriteRule ^/user/project/([a-zA-Z0-9]*)/([a-zA-Z0-9]*)$ /user/project/index.php?q=$1&r=$2 [L] 
RewriteRule ^/user/project/([a-zA-Z0-9]*)$ /user/project/index.php?q=$1 [L] 

你应该是对的。

【讨论】:

  • 不幸的是,它仍然给我一个 404 错误页面。我已经将它上传到我的虚拟主机服务器上,它也是一个 404。我想检查一下它是否可能是我的设置。
  • 由于我只匹配 4 位数字是我的错,我是否只需从正则表达式中删除 {4}
  • 如果你不想匹配 4 个字符,请将其设为 * 即 [a-x]*
猜你喜欢
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2014-09-20
  • 2011-02-28
  • 2018-12-21
相关资源
最近更新 更多