1

最终编辑:看来我已经弄清楚了!下面回答。

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

编辑三:到目前为止,freenode 上的一位友好伙伴已经想出了以下 RewriteRule,他试图帮助我解决一些问题:

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

不管这种疯狂的月亮语言正则表达式看起来多么酷,它只适用于其中带有哈希的 URL——它破坏了其他所有内容。如果它们是 404 或类似的东西,有没有办法让这些 RewriteRules 回退?

编辑四:有人建议:

FallbackResource /index.php

也没有运气。

原来的问题:

我正在一个网站上工作,该网站的某些 url 具有从项目标题派生的 URL(作为标题的示例,thisUrlDerivedFromUrl - #example),看起来像这样:

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

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

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

需要明确的是,我不是在寻找花哨的 AJAX url 或任何类似的东西,当我尝试和谷歌寻找解决方案时。这只是此特定站点上的一堆某些预先存在的项目的问题,由于 URL 中存在 # 字符而无法解决,这是从项目标题派生的值,人们喜欢在他们上传的项目的标题中抛出不会去任何地方的主题标签以及诸如“我是#1”之类的东西或东西。

所以,这里是关键——在 Yii 中,有一个选项可以隐藏脚本名称(index.php),使用

showScriptName => 'false'

config/main.php 中的指令。根据网站运营商的说法,这是该网站所期望的行为。但是,我暂时禁用了 showScriptName,因为其中带有哈希的 URL 没有它就无法工作,这使得 URL 看起来都像这样:

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

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

我将提供我的 .htaccess,以及我的 urlManager 数组在 config/main.php 中的样子,希望有人可能对找到解决此问题的方法有一些答案。为了寻求解决方案,我可以分享的任何想法或其他任何东西都是有帮助的,并提前表示赞赏:)

.ht 访问:

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'),
),

编辑:显然,在我去 muntzed htaccess 文件之前,这些 URL 工作正常,该文件在其以前的化身中是 muntzing facebook 能够访问 opengraph 的静态图像文件链接。我对这个断言提出异议,即在使用备份对其进行测试之前它运行良好 - 将其切换回旧的 htaccess&code 确实如此。不过这里仅供参考:

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]
4

1 回答 1

0

由于freenode上的一个友好的陌生人将它与以下疯狂的月亮语言正则表达式解决方法挂钩,我现在已经弄清楚了:

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

显然我并没有真正说疯狂的月亮语言,但这就是我推断它的意思:它说 match $1 () 是不包括 # 的任何字符组([^#] 表示不 #)直到 #,然后匹配 $2 与另一端相同,在任何事件 # 之后使用通配符 *。

向任何考虑过答案的人干杯!

于 2013-06-24T03:37:10.400 回答