带/斜杠的Mod-Rewrite问题(Apache)

时间:2009-06-18 08:21:21

标签: apache mod-rewrite

我打赌这里有一个明显的问题,我没有看到。

对于那些熟悉Mod-Rewrite

的人来说,这是重要的一点 带有mod-rewrite规则的

.htaccess文件存在于: http://www.thedomain.com/.htaccess 用户转到此网址: http://www.thedomain.com/test/blog Mod-Rewrite规则实际上应该告诉服务器访问此URL: http://www.thedomain.com/index.php?page=blog

htaccess的:

Options FollowSymLinks
Options -MultiViews
RewriteEngine on
RewriteRule ^test/([^/.]+)$ /index.php?page=$1 [L]

此代码/请求组合不起作用。如果你想知道代码片段^测试不是^ / test,那是因为显然这是GoDaddy的一个问题,代码在^后面失败 - 这似乎可能与我的问题有关,我将进一步解释......如果我更改.htaccess代码行:

RewriteRule ^test/([^/.]+)$ /index.php?page=$1 [L]

RewriteRule ^test([^/.]+)$ /index.php?page=$1 [L]

(只需删除/ here:^ test /([^/.]+))

当用户查看正确的index.php?page = blog服务器响应时,请求的URL更改为容纳(删除斜杠; http://www.thedomain.com/ testblog )时,代码可以正常工作。在我看来,我不能在RewriteRule的darn匹配方面使用任何斜杠。是什么给了什么?

更新:如果完全相关,这个.htaccess文件和问题的相关文件都存在于托管此主机的GoDaddy服务器的子目录中,尽管该域指向子目录根。不确定这是否相关。

更新:此服务器(在服务器根目录下)实际上正在运行带有漂亮网址的wordpress,它们的工作完全正常。我假设wordpress使用mod-rewrite来制作疯狂的网址,比如thedomain.com/2008/11/15/the-article-title.html工作......?

非常感谢。

5 个答案:

答案 0 :(得分:2)

RewriteBase您要找的是什么?

答案 1 :(得分:2)

这里有一个很好的测试实用程序

http://www.helicontech.com/download-isapi_rewrite.htm

尝试将代码更改为:

^/test/([^/]+)$ /index.php?page=$1 [L]

或没有斜线

^test[^a-z]+([a-z]*)$ /index.php?page=$1 [L]

答案 2 :(得分:1)

我无法在GoDaddy上找到解决此问题的可靠方法;无论出于何种原因,我都不能在URL中尝试重写(http://www.somedomain.com/testingthis除了http://www.somedomain.com/testing/this之外)。

我最终使用Wordpress .htaccess将所有不存在的文件/目录请求发送回我的index.php。然后我使用带有pathinfo()的$ _SERVER ['REQUEST_URI'] var来解析URL,然后指导要从解析加载的内容。这很好用,速度很快,可能与Wordpress使用的方法相同。

感谢您的尝试!

答案 3 :(得分:0)

  

如果你想知道代码片段^测试不是^ / test,那是因为显然这是GoDaddy的一个问题,代码在^ [...]

之后失败了

这不奇怪但是必要:

  

<强> Per-directory Rewrites

     

.htaccess文件中使用重写引擎时,每个目录前缀(对于特定目录始终相同)会自动删除以进行模式匹配并自动替换完成后添加

每个目录前缀用于文档根目录(/.htaccess)中的.htaccess文件的URL路径根(/)。因此,必须使用每个目录前缀 ^编写/的模式。

以同样的方式处理替换。应用规则后,每个目录前缀将添加到替换项中。所以试试这条规则:

RewriteRule ^test/([^/.]+)$ index.php?page=$1 [L]

答案 4 :(得分:0)

好的,首先,我认为GoDaddy apache服务器只是关闭了一些选项。我认为,如果他们的配置中没有AllowOverride FileInfoRewriteRule将无法正常运行,或者根本无法运行。

这意味着令人惊讶的是网址http://www.thedomain.com/testblog完全有效,并且会被重写。所以我想我有点困惑。

这是一个想法:尝试创建一个名为test的目录,并将.htaccess文件放在那里!它看起来像这样:

Options FollowSymLinks
RewriteEngine on
RewriteRule ^([^/]+)$ /index.php?page=$1 [L]

好的,另一个想法:使用RewriteCond。也许你可以直接检查请求URI,如下所示:

Options FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/test/([^/]+)
RewriteRule . /index.php?page=%1 [L]

最后一个想法:也许您的浏览器会看到URL http://www.thedomain.com/test/blog并认为它是一个目录,并添加斜杠?因此,发送的网址为http://www.thedomain.com/test/blog/。在这种情况下,除非您允许使用尾部斜杠,否则REGEX将不匹配:

RewriteRule ^test/([^/.]+)/?$ /index.php?page=$1 [L]

糟糕。很抱歉 - 在重写的HTTP请求中有很多可能出错的东西,以及尝试克服这些问题的多种方法: - )