草庐IT

php - 友好的 URL 和 htaccess 级别

coder 2024-01-02 原文

我有这个 .htaccess

RewriteEngine On
RewriteRule ^custom index.php?page=value [NC,L]

如果 index.php 和 .htaccess 位于同一文件夹中,则它有效。

我想将 .htaccess 文件放在根目录中,并使放在 newFolder 中的内容对 htaccess 规则使用react。说:

.htaccess -> 根级别
index.php -> 根目录/新文件夹级别

我确实尝试过:
RewriteEngine On
RewriteRule ^custom newFolder/index.php?page=value [NC,L]

完全没有反应(404):(

我想解决方案必须很简单,但是......

任何帮助将不胜感激。

最佳答案

让我们确保我们在同一页面上。 ;) 在我的服务器根目录中,我有一个 .htaccess 文件,在该文件中我有:

RewriteEngine On
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L]

RewriteRule 具有三个组件:匹配模式、目标和标志列表。匹配模式可以包含纯文本或正则表达式。目标可以包含纯文本或带有在正则表达式匹配模式中捕获的混合变量的文本。匹配模式和目标都相对于 .htaccess 文件所在的目录。

匹配模式与 URL 中当前目录之后的文本进行比较。如果匹配成功,则从 .htaccess 文件所在的目录调用目标。如果在匹配模式中捕获了信息,则首先将目标中的变量插入到目标中。

在此示例中,.htaccess 文件位于服务器根目录中,因此匹配模式与以下 URL 文本进行比较:http://localhost/
为了测试它,这是我放在 index.php 文件中的 PHP 代码:
<?php

echo 'page value: ' .$_GET['page'] . '<br>';
echo 'script loaded: ' . $_SERVER['PHP_SELF'];

?>

当我导航到 http://localhost/custom在我的浏览器中:将正则表达式匹配模式与字符串“custom”进行比较,匹配成功,因此目标 index.php?page=value被执行,并且我在根目录中加载了 index.php 页面。显示的页面如下所示:
page value: value
script loaded: /index.php

接下来,我在服务器根目录中创建一个名为“newFolder”的新目录,并将 index.php 文件复制到新创建的目录中。

当我导航到 http://localhost/newFolder/custom在我的浏览器中:将正则表达式匹配模式与字符串“newFolder/custom”进行比较,再次成功匹配,这次是目标 newFolder/index.php?page=value被执行,并且我在加载了 newFolder 目录中的 index.php 页面。显示的页面现在看起来像这样:
page value: value
script loaded: /newFolder/index.php

因此,同样,我可以在根目录中创建任意数量的目录并在这些目录中创建新的 index.php 文件,并且当导航到这些目录中的“自定义”时,这个 .htaccess 文件应该加载相应的 index.php 文件当前子目录。

~~~

我将在这里尝试一下,假设您想动态加载页面,因此将“自定义”捕获为动态页面名称并将其转储到页面字段中(替换“值”)并将其发送到索引。 php 文件在当前子目录中。
RewriteEngine On

RewriteCond %{REQUEST_URI} !index\.php
RewriteRule ^(.+/)?(.+)$ $1index.php?page=$2 [NC,L]

如前所述,括号捕获动态文本并将其转储到美元符号数字所在的目标字符串中。因此,第一组括号中捕获的文本替换“$1”,第二组括号中捕获的文本替换“$2”。我还添加了 RewriteCond声明以防止此规则双重浸入。 :) 如果我不为“自定义”调用和重定向到 index.php 执行此规则。

所以现在当我导航到 http://localhost/newFolder/whoopdeedoo ,正则表达式匹配模式与“newFolder/whoopdeedoo”进行比较,匹配成功,目标newFolder/index.php?page=whoopdeedoo被执行,我得到:
page value: whoopdeedoo
script loaded: /newFolder/index.php

~~~

冒着嗡嗡声的风险,这里有一些背景信息。您提到这在根目录中有效:
RewriteEngine On
RewriteRule ^custom index.php?page=value [NC,L]

但是在将浏览器导航到子目录时它不起作用。阅读评论后,您似乎发现下一点适用于子目录,特别是“newFolder”:
RewriteEngine On
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L]

但现在它不再适用于根目录。所以你可以简单地包括两者:
RewriteEngine On
RewriteRule ^custom index.php?page=value [NC,L]
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L]

然而,这里有几件事让我印象深刻。一个是,我宁愿将 .htaccess 文件放在每个子目录中,并在那里接管 URL 处理,而不是在我的根目录中硬编码目录名称 .htaccess。

但是,如果出于某种原因,您更喜欢在根目录中维护一个 .htaccess 文件,那么,让我感到惊讶的是规则中的重复。因此,或者,您可以使用正则表达式使子目录名称成为捕获的变量,如本答案顶部所示:
RewriteEngine On
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L]

正则表达式捕获括号替换了文本“newFolder/”,在括号内我们说的是“捕获一个或多个字符后跟正斜杠”。然后,如果匹配成功,捕获的值将替换目标中的“$1”。这也适用于根的原因是因为括号后面的问号使得括号内的正则表达式是可选的。因此,如果在“自定义”之前没有任何内容,我们仍然可以进行匹配。在这种情况下,“$1”将被替换为空字符串。

关于php - 友好的 URL 和 htaccess 级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27723962/

有关php - 友好的 URL 和 htaccess 级别的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  5. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  6. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  7. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  8. ruby-on-rails - 使用 Dragonfly 从 URL 分配图像 - 2

    我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ

  9. ruby 正则表达式 : replace double slashes in URL - 2

    除了协议(protocol)定义中的斜杠('http[s]://'、'ftp://'等)之外,我想替换URL中的所有多个斜杠。我该怎么做?此代码无一异常(exception)地替换:url.gsub(/\/\/+/,'/') 最佳答案 您只需排除任何以:开头的匹配项url.gsub(/([^:])\/\//,'\1/') 关于ruby正则表达式:replacedoubleslashesinURL,我们在StackOverflow上找到一个类似的问题: http

  10. ruby-on-rails - faraday如何设置日志级别 - 2

    我最近将我的http客户端切换到faraday,一切都按预期工作。我有以下代码来创建连接:@connection=Faraday.new(:url=>base_url)do|faraday|faraday.useCustim::Middlewarefaraday.request:url_encoded#form-encodePOSTparamsfaraday.request:jsonfaraday.response:json,:content_type=>/\bjson$/faraday.response:loggerfaraday.adapterFaraday.default_ada

随机推荐