草庐IT

php - htaccess 重写规则在提交表单时导致错误

coder 2024-04-06 原文

我使用我的 htaccess 文件来配置我网站上的 url 布局。

目前的问题是我无法再发送任何表格。

我有两个文件,它们将包含完全相同的代码(复制并重命名)。如果我调用 page1.php,url 将显示为 page1.php。一切正常,但我会尝试登录或导致一些错误。现在,当我调用 index.php(具有相同的代码!)时,htaccessindex.php 隐藏在 url 中,因为它应该这样做!但是当我测试登录脚本时,发布表单时什么也不会发生。它只是刷新网站。所以我不知道为什么会这样?

这种行为肯定是由 htaccess 通过重写规则引起的。我删除了 htaccess 并重试。没有它它可以工作,但仍然有这个难看的 url。

可以显示 htaccess 中的内容:

RewriteEngine On

RewriteCond %{REQUEST_URI} ^(.*)\.html$
RewriteRule ^.*\.html$ %1.php [L]  

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php

AddType application/x-httpd-php .htm .html

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

RewriteRule ^index\.(htm|html|php) http://www.domain.com/ [R=301,L]
## rewrite the index file in subdirectories
RewriteRule ^(.*)/index\.(htm|html|php) http://www.domain.com/$1/ [R=301,L]

表格将发送:

form action = "<?php echo $_SERVER['PHP_SELF']?>" method= "post"...

因此,如果有人可以帮助我,我将不胜感激。

更新:

为了进一步说明我想要实现的目标:

首先结构如下:由于不同的语言,根结构是这样的:

www.domain.com/languagefolder/...

现在,当用户调用 www.domain.com 时,他将被重定向到 languagesubfolder。当被重定向到该子文件夹的索引页时,第一件事应该是 www.domain.com/languagesfolder/index.php 将不可见,因此它只是 www.domain.com/语言文件夹/。这将自动完成。没关系。但是当调用 www.domain.com/languagesfolder/index.php 时,它应该被重写为 www.domain.com/languagesfolder/ 这样用户就看不到 .../index.php。这样看起来更专业。

接下来将在更多页面上提供链接,这样用户只需输入 .../page 而不是 .../page.php 这样就不会显示文件扩展名。最后但并非最不重要的最后一件事是当用户试图找出它是什么类型的文件时,我想通过重写扩展名来防止 SQL 注入(inject),以便用户可以键入 .../page.php 以及 .../page.html.../page.htm

最佳答案

使用:

form action = "<?php echo $_SERVER['PHP_SELF']?>" method= "post"...

发布您的表单可能会导致以下结果:

form action = "/index.php" method = "post"...

在您的代码中。您遇到线路问题的原因:

RewriteRule ^index\.(htm|html|php) http://www.domain.com/ [R=301,L]

是不是它正在捕获您要发布到的 index.php,然后将您重定向到 http://www.domain.com/ 没有您的帖子数据。

如果您使用 firefox 并安装了 firebug,您可以通过查看网络面板并在提交表单之前单击“坚持”来实时看到这种情况。您将看到 POST/index.php 的 301 重定向,后跟 http://www.domain.com/ 的 GET。 .

您可以通过替换以下行来解决此问题:

form action = "<?php echo $_SERVER['PHP_SELF']?>" method= "post"...

与:

form action = "/" method= "post"...

或:

form action = "<?php echo rtrim($_SERVER['PHP_SELF'], 'index.php'); ?>" method= "post"...

这与使用 str_replace 相同,但只会删除最右边出现的“index.php”。

HTH.

关于php - htaccess 重写规则在提交表单时导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15032042/

有关php - htaccess 重写规则在提交表单时导致错误的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  4. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  5. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  6. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  7. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  8. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  9. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  10. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

随机推荐