我的.htaccess中有下面这行
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]当我在http://website.com/folder/value中有任何东西时,这总是给我一个500的内部错误。
如果我简单地将其更改为
RewriteRule ^folder/(.*)\.html$ /folder/?value=$1 [L]它会将我正确地发送到在$_GET中设置了value.html的http://website.com/folder/value.html。
我希望能够接受任何东西,比如value,value.com,value-4,otheritem。
你知道为什么我的正则表达式每次都会出现500内部服务器错误吗?
发布于 2013-01-13 11:39:07
你可能会收到500个错误,因为你的规则是循环的。规则的目标与模式本身匹配(/folder/?value=value与^folder/(.*)$匹配,因为查询字符串在匹配之前被剥离)。尝试包括应用于规则的条件,如下所示:
RewriteCond %{REQUEST_FILENAME !-f
RewriteCond %{REQUEST_FILENAME !-d
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]或者:
RewriteCond %{REQUEST_URI} !^/folder/?$
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]但从技术上讲,@Suku建议的应该是可行的:
RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]发布于 2013-01-13 14:05:21
您可以尝试这种方法,将/folder和value (键“value”的值)视为动态字符串,而不管它们的格式如何。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} .*/([^/]+)/([^/]+)/? [NC]
RewriteRule .* %1/?value=%2 [L]它在内部映射一个URL,如下所示:
http://website.com/anyfolder/anyvalue或
http://website.com/any/number/of/folders/anyfolder/anyvalue
至:
http://website.com/anyfolder/?value=anyvalue
当然,/anyfolder必须存在于映射的URL中,否则将出现404错误。
此规则集在真实服务器上进行了测试,没有出现任何问题。
发布于 2013-01-15 02:18:19
以下是该规则的执行情况:
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]由于
/folder/test ,请求的URL与模式匹配并被重写为 stops
但是,由于路径/文件名已更改(/folder/test变为/folder/),mod_rewrite将执行另一次迭代:
与模式匹配并重写为/folder/?value=
的
/folder/?value=test正如在其他评论/答案中提到的,将*更改为+,它应该可以解决问题。如果存在/folder/ index.php并包含,则需要额外的一行:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]重写之后,Apache将为现有目录提供默认文档,这将引发另一次重写迭代。这种情况会阻止mod_rewrite将/folder/index.php?value=test改回/folder/?value=index.php。
https://stackoverflow.com/questions/14300353
复制相似问题