在某些网址中具有百分比编码#char(%23)的Yii网站无法解决

时间:2013-06-24 02:22:10

标签: php apache url yii litespeed

最终修改:好像我已经弄明白了!回答如下。

编辑二:我认为Apache通常是后方的巨大痛苦,但我无法将生产的网络服务器从Litespeed(专有的apache)切换到nginx,这些URL解决没有问题。但是,是的,就像一个注释 - 这个东西在nginx中运行得很好。

编辑三:以下RewriteRule已经找到了freenode的友好人员,他试图帮助我解决一些问题:

RewriteRule ([^#]+)#([^#]+) /index.php/$1¦$2 [L,QSA,NC]

然而,这个疯狂的月亮语言正则表达式看起来很酷,它只有适用于带有哈希的URL - 它破坏了其他一切。有没有办法让这些RewriteRules在404或类似的东西后退回?

编辑四:有人建议:

FallbackResource /index.php

也没有运气。

原始问题:

我正在开发一个网站,其网站上有一些网址,这些网址来自项目标题(作为标题的示例, thisUrlDerivedFromUrl - #example ),看起来像什么像这样:

http://example.com/listen/thisUrlDerivedFromItemTitle+-+%23example-mid26372

但是,这会将我带到以下404错误页面,您可以在其中看到请求在#doding编码为%23时被截断:

Error 404
Unable to resolve the request "listen/thisUrlDerivedFromItemTitle+-+"

要明确的是,我不是在寻找花哨逃脱的AJAX网址或类似的东西,当我尝试谷歌寻求解决方案时。这只是由于URL中存在#字符而导致该特定网站上的一些特定预先存在的项目无法解决的问题,该字符是从项目标题派生的值,人们喜欢在他们上传的项目的标题中抛出那些不会去任何地方的主题标签或类似“我是#1”的东西。

所以,这是踢球者 - 在Yii中,有一个选项可以使用

隐藏脚本名称(index.php)
showScriptName => 'false'
config / main.php中的

指令。根据网站运营商的说法,这是该网站的理想行为。但是,我现在已经禁用了showScriptName,因为没有它的哈希值不能正常工作,这使得URL看起来像这样:

http://example.com/index.php/listen/thisUrlDerivedFromItemTitle+-+%23example-mid26372

问题是这个URL格式解决得很好,没有404乱或类似的东西。我不认为我的雇主对这种妥协感到满意。

我将提供我的.htaccess,以及我的urlManager数组在config / main.php中的样子,希望有人可能会在找到解决此问题的方法时找到答案。任何想法,或者我可以分享的任何其他内容,以寻求解决方案都是有帮助的,并提前感谢:)

htaccess的:

Options +FollowSymLinks

IndexIgnore */*

RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\?*$ index.php/$1 [L,QSA]
config / main.php中的

urlManager数组:

'urlManager' => array(
    'urlFormat' => 'path',
    'showScriptName' => true,
    'rules' => array(
        'user/<_a:(register|update|forgottenpassword)>' => 'user/<_a>',
        'user/<username>' => 'user/view','user/<username>/<_a>' => 'user/<_a>',
        'listen/<title>-mid<id>' => 'mixtape/listen'),
),

编辑:显然这些网址在我去之前工作得很好,并将htaccess文件放大了,该文件在之前的版本中,正在弄脏facebook能够访问用于opengraph的静态图像文件链接。我认为它之前的工作正常,然后根据备份进行测试 - 将其切换回旧的htaccess&amp;代码确实zilch。这里仅供参考:

Options +FollowSymLinks

IndexIgnore */*

RewriteEngine on


RewriteCond %{HTTP_REFERER} !^http://example.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://example.com$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.example.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.example.com$      [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|bmp|mp3|zip)$ - [NC,F,L]

RewriteBase /

# if a directory or a file exists, use it directly

RewriteCond %{REQUEST_FILENAME} -s [OR]

RewriteCond %{REQUEST_FILENAME} -l [OR]

RewriteCond %{REQUEST_FILENAME} -d

# otherwise forward it to index.php 

RewriteRule ^.*$ - [NC,L]

RewriteRule ^.* - [F,L]

RewriteRule ^.*$ index.php [NC,L]

1 个答案:

答案 0 :(得分:0)

我现在已经弄明白了,感谢freenode上一位友善的陌生人用以下疯狂的月球语言正则表达式解决方法来解决这个问题:

RewriteRule ([^#]+)#?([^#]*) /index.php/$1$2 [L,QSA,NC]

显然我并不是真的会说疯狂的月亮语言,但我推断这意味着:它说匹配$ 1()是任何不包括#的字符组([^#]表示不#)最多为#,然后匹配$ 2与另一方相同,在任何事件发生之后使用通配符*。

对任何考虑过答案的人欢呼!