.htaccess rewriterule / state / city /

时间:2012-01-23 21:28:16

标签: html .htaccess mod-rewrite

这需要一些解释,所以我希望我不会失去所有人。

我需要得到以下内容:
http://example.com/results.html?state=iowa&city=davenport

变成:
http://example.com/iowa/davenport/

我能够通过使用这两个重写来实现这一目标:

  

RewriteRule ^([A-Za-z0-9 - ] +)/?$ cities.html?state = $ 1
RewriteRule   ^([A-Za-z0-9 - ] +)/([A-Za-z0-9 - ] +)/?$ results.html?state = $ 1& city = $ 2

问题是在后端有“某些代码在某处”,由于第二次重写而被破坏。它与根据所选择的另一个的结果填写选择框有关(我认为这不重要)。我认为问题在于我对/州/城市的修改过于宽泛。

以下是我的完整版本(为安全性而修改).htaccess文件:

IndexIgnore *
AddHandler application/x-httpd-php5 .html .htm

RewriteRule ^([A-Za-z0-9-]+)/?$ cities.html?state=$1
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ results.html?state=$1&city=$2

<Files .htaccess>
order allow,deny
deny from all
</Files>

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

<IfModule mod_suphp.c>
 suPHP_ConfigPath /home/USER
<Files php.ini>
 order allow,deny
 deny from all
</Files>

它搞砸的代码非常复杂,而且是别人的代码。几个小时之后,我一直无法跋涉他们所有的东西,甚至接近我可能能够改变他们的东西以使事情发挥作用。

有没有人对我能做些什么来避免这个问题?我真的只有3个.html文件,我正在汇集我的前端代码,所以我尝试了类似的东西

我的rewriterules

与仅使用“files”而不是filesMatch相同。我想出的所有东西都会以某种方式破坏其他东西或整个网站。

2 个答案:

答案 0 :(得分:1)

首先:(i)hostgator不会启用或授予您访问重写日志的权限; (ii)你的suPHP配置有语法错误,hostgator几乎肯定会有这种情况,并且.htacess / php.ini在其自己的root / vhost配置中拒绝。但是,我将专注于mod_rewrite元素:

RewriteEngine On

RewriteRule ^([A-Za-z0-9-]+)/?$ cities.html?state=$1
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ results.html?state=$1&city=$2

RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

我还假设在启用了重写引擎的子目录中没有任何.htaccess文件,因为这些文件可以在重写“每个目录”优先级规则下抢占它。

Rules(3)是一个简单的域重定向器。 Rule(4)是一个严苛的:将任何不是现有文件或目录的URI重定向到当前目录中的index.php,但保留查询字符串。

规则(1)和(2)是您的新规则。正如Mike所说,您应该包含[L],但由于文件cities.htmlresults.html存在,因此无论如何都不会匹配。

我很好奇为什么URI中的尾随slach是可选的。最好决定并解决这个问题。

问题在于(1)和(2)的匹配标准是两个广泛的,并且正在拾取用于一般捕获的URI(4)。您需要将其锁定以使这些互斥。一个原因是挖掘您的访问日志(可以与hostgator一起使用)来查找应用程序所期望的标准URI并检查是否匹配(1)或(2) - 但是,由于大多数将包含“。”,可能并非如此。但请检查。

另一个问题是现有脚本是否使用绝对或相对引用,例如任何输出HTML中的<img src="images/myimage.png">。这里浏览器要求http://www.example.com/texas/houston说出来,因此会查找与{1},(2)或(3)不匹配的http://www.example.com/texas/images/myimage.png因此被(4)捕获并传递给{ {1}}。同上CSS文件等因此他们不会404和/index.php会混淆并发送一些默认的响应,这将毫无希望地混淆浏览器。

然而,再次分析访问日志(在这种情况下或带引用者index.php的USI)将显示是否正在进行。

如果您的应用使用标准子目录,那么您可以通过类似

的规则(3.1)来修复此问题
http://www.example.com/texas/houston

虽然细节取决于您的应用程序的其余部分。

答案 1 :(得分:0)

我能够通过将我的(相关).htaccess条目更改为以下内容来解决此问题:

  

RewriteEngine On   RewriteRule ^([A-Za-z0-9 - ] +)/?$ cities.html?state = $ 1
  RewriteCond%{REQUEST_URI}!^ / signup /
  RewriteRule ^([A-Za-z0-9 - ] +)/([A-Za-z0-9 - ] +)/?$ results.html?state = $ 1&amp; city = $ 2
  RewriteCond%{HTTP_HOST} ^ example.com
  RewriteRule(。*)http://www.example.com/ $ 1 [R = 301,L]
  RewriteCond%{REQUEST_FILENAME}! - f
  RewriteCond%{REQUEST_FILENAME}!-d
  重写规则。 index.php [L]

增加的是:

  

RewriteCond%{REQUEST_URI}!^ / signup /

HostGator能够在某个地方的某个地方找到问题/注册,从来没有找到他们能够查看的日志,但我认为这是我无法访问的内容。